1

我需要确保 Model1 和 Model2 都保存或都不保存,我很确定我应该能够在事务中执行此操作,但它似乎不起作用。

我不确定我是否了解交易如何正常工作。我认为该事务对于包装在装饰器中的整个函数调用都是有益的。

我也不确定这是否也只是一个 Sqlite 问题。

模型.py

from django.db import models
class Model1( models.Model ):
    name = models.CharField( max_length = 20 )
    number = models.IntegerField( )

class Model2( models.Model ):
    name = models.CharField( max_length = 20 )
    number = models.IntegerField( )
    parent = models.ForeignKey( Model1 )

示例交易代码

from django.db import transaction

@transaction.commit_manually
def somefunction( name ):
    try:
        a = Model1.objects.get( name = name )
    except Model1.DoesNotExist:
        a = Model1( name = name )

    try:
        b = Mode2.objects.get( name = name)
    except Model2.DoesNotExist:
        b = Model2( name = name )

    a.number = 3
    b.number = 'a'

    try:
        a.save()
        b.parent = a
        b.save()
        transaction.commit()
    except:
        transaction.rollback()

我没有尝试过 MySQL 或 Postgres,因为我实际上没有发现任何具体说 Sqlite 不能做到这一点的东西,所以只是想知道我做错了什么,或者它是否确实是 Sqlite3。

4

1 回答 1

1

所以最终的答案是事务工作正常,只是我的单元测试没有继承自

https://docs.djangoproject.com/en/1.2/topics/testing/#django.test.TransactionTestCase

因为我只是从 TestCase 继承的,所以每个 test_ 方法都包装在一个事务中,我无法控制 .commit() 或 .rollback() 行为。

这只是我完全没有意识到测试用例是如何运行的。

于 2013-03-07T19:59:05.537 回答