2

2つのモデルを検討してください(明らかな論理的な問題を無視します)。

class Owner(m.Model):
    id = m.IntegerField(primary_key=True)

class Pet(m.Model):
    owner = m.OneToOneField(Owner, related_name="pet", primary_key=True)

新しいを作成するときに、それらを自動的に保存Ownerすることは可能ですか?.pet

現在、これは何が起こるかです:

>>> o = Owner()
>>> o.pet = Pet()
>>> o.save()
>>> o.id
42
>>> o.pet.id
None
>>> o.pet.owner_id
None
>>> o.pet.owner == o
True

o.petしかし、私はそれが保存の過程で保存されることを望んでいます(そして期待していますか?)o

ノート:

  • オーバーライドを提案する場合Owner.save:どのようcommit=Falseに処理する必要がありますか?
  • OneToOneFieldfromからPettoに移動するOwnerと、データベーススキーマの意味が低下するため、望ましくありません。
4

1 に答える 1

2

質問を正しく理解していれば、django.db.models.signals.post_saveオーバーライドせずに目的の結果を達成するために使用できますOwner.save()

from django.db.models.signals import post_save

post_save.connect(save_pet_handler, sender=Owner, dispatch_uid="my_unique_identifier")

def save_pet_handler(sender, instance, created, **kwargs):
    ...

o.save()呼び出されると、を呼び出すためのシグナルが発生します。ここで、のブール値に応じて、保存または更新save_pet_handlerすることができます。o.petcreated

于 2012-04-05T21:10:14.030 に答える