Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django如何插入到相互引用的表中_Python_Django_Foreign Keys_Foreign Key Relationship_Cyclic Reference - Fatal编程技术网

Python django如何插入到相互引用的表中

Python django如何插入到相互引用的表中,python,django,foreign-keys,foreign-key-relationship,cyclic-reference,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) 我使用循环外键的原因是为了数据完整性。因为一个地址可能只分配给一个用户,并且一个用户必须至少有一个地址。是

我使用的是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()
但是,我第一次调用
addr.save()


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

这里的问题是,因为PostgreSQL不会等到事务结束时才检查NOTNULL

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

我的列被设置为非空

作为解决办法,我正在这样做

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值永远不会为零

如果要返回此人,如何在模板文件中获取此人的地址?