2010-01-25 90 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