0

我使用Django 1.6,我有2種型號引用對方,像這樣:的Django如何插入到表中的相互引用

class Person(models.Model): 
    address = models.ForeignKey('Address', blank=False) 

class Address(models.Model): 
    person = models.ForeignKey(Person, blank=False) 

我之所以有環外鍵的是對數據的完整性。因爲地址可能只能分配給一個用戶,並且用戶必須至少有一個地址。是的,我知道我可以沒有這種生活,但我寧願不。

我使用PostgreSQL和我的外鍵DEFERRABLE INITIALLY DEFERRED,我想使用事務將數據插入到這些表中。 但是,當我嘗試使用transaction.atomic():時,它在我看來並不像預期的那樣運行。

下面是我在做什麼:

with transaction.atomic(): 
    addr = Address(street='125 fake street') 
    addr.save() 

    person = Person() 
    person.address_id = addr.id 

    addr.person_id = person.id 

    addr.save() 
    person.save() 

不過,我不斷收到IntegrityError我第一次打電話addr.save()

任何建議我做錯了嗎?有沒有更好的方法呢?

回答

2

這裏的問題是,因爲PostgreSQL不會等待直到事務結束才能檢查NOT NULL。

sql-set-constraints reference

「NOT NULL,並檢查當行被插入或修飾(未在語句的末尾)約束總是立即檢查」。

而我的列被設置爲NOT NULL。

作爲一種變通方法,我做這個

with transaction.atomic(): 
    addr = Address() 
    addr.person_id = 0 # setting this temporarily to Zero 
    addr.save() 

    person = Person() 
    person.address_id = addr.id 
    person.save() 

    addr.person_id = person.id 
    addr.save() 

這讓我插入到數據庫中,並在以後更新外鍵,並且仍然失敗,如果沒有國外關鍵的比賽,因爲我永遠不會id值爲零。

+0

如果您要返回此人,您如何才能在模板文件中獲取此人的地址? –