1

Model1 と Model2 の両方が保存されるか、どちらも保存されないようにする必要があります。トランザクションでこれを実行できるはずですが、機能していないようです。

トランザクションがどのように正しく機能するかを理解しているかどうかはわかりません。デコレータにラップされた関数呼び出し全体にトランザクションが良いと思いました。

これが単なるSqliteの問題なのかどうかもわかりません。

models.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()

私は実際にSqliteがこれを行うことができないと具体的に言っているものを見つけていないので、MySQLまたはPostgresを試していません.

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 に答える