我正在使用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()
有什么建议我做错了吗?有更好的方法吗?
答案 0 :(得分:2)
这里的问题是,因为PostgreSQL不等待,直到事务结束才检查NOT NULL。
" 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值永远不会为零。