2012-04-05 125 views
1

考慮兩個模型(忽略了明顯的邏輯問題):Django:從* related *模型自動保存OneToOneField?

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處理?
  • OneToOneFieldPet移動到Owner是不受歡迎的,因爲這會導致數據庫架構不太合理。

回答

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