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を試していません.