django如何插入表中互相引用

时间:2014-04-07 02:15:59

标签: python django foreign-keys foreign-key-relationship cyclic-reference

我正在使用django 1.6,我有两个模型相互引用:

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()

有什么建议我做错了吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

这里的问题是,因为PostgreSQL不等待,直到事务结束才检查NOT NULL。

sql-set-constraints reference

" NOT NULL和CHECK约束总是在插入或修改行时(而不是在语句的末尾)立即检查。"

我的列设置为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值永远不会为零。