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移动到PettoOwner是不可取的,因为它会导致不太明智的数据库模式。
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.pet保存或更新,这取决于 的布尔值created

于 2012-04-05T21:10:14.030 回答