2010-01-25 96 views
0

geonames數據庫有兩個互相引用的模型。在postgres數據庫中,引用是由外鍵關係提供的。問題在於將數據寫入數據庫 - 寫入到一個表中而沒有在另一個表中引用的ID違反了外鍵約束。將geonames數據庫導入到dgango項目的postgres - 外鍵約束問題

Class Geoname 
    id = IntegerField(primary_key=True) 
    admin_1 = foreignkey('Admin1', null=True, db_index=True) 

Class Admin1 
    country = models.ForeignKey(Country, db_index=True) 
    geoname = models.ForeignKey(Geoname, related_name="admin1_set", db_index=True) 

有沒有辦法寫這個模式的postgres數據庫,避免違反外鍵約束?

如果不是,我認爲可能的解決方案可能是從geoname類中刪除admin_1,但是django仍會繼續使用geoname.admin1_set?請記住,數據正在直接寫入數據庫而沒有ORM - 我認爲向後關係是由django ORM創建的 - 我不知道它們是如何在數據庫級別表示的)。

回答

0

第一:在您的數據庫模式中建立循環關係意味着您的模式設計不好。

反向引用實際上是由ORM創建的,但它是在動態創建(讀取)而不是寫入時創建的。
否則它將無法加載燈具進行自動化測試...

這是一對一的關係嗎?如果是這樣,你可以使用OneToOneField:

Class Geoname 
    id = IntegerField(primary_key=True) 
    admin_1 = OneToOneField('Admin1') 

Class Admin1 
    country = models.ForeignKey(Country, db_index=True) 

我希望這些類從django.db.models.Model在你真正的代碼繼承!

如果它不是一個一對一的關係,你可以這樣做:

Class Geoname 
    id = IntegerField(primary_key=True) 

Class Admin1 
    country = models.ForeignKey(Country, db_index=True) 
    geoname = models.ForeignKey(Geoname, db_index=True) 

,你有機會獲得由

g = Geoname.objects.get(id=1) 
g.admin1_set.all() # Returns all Admin1 objects related to Geoname 

你是指在一定Geoname所有Admin1對象可以在documenation中閱讀有關此類查詢的內容。

+0

感謝您的建議!這是別人的代碼,我試圖找出 - 我不確定循環關係是否可以,甚至可能! – 2010-01-26 18:02:56