Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
Sql IntegrityError:删除时外键冲突_Sql_Database_Django_Postgresql_Django Models - Fatal编程技术网

Sql IntegrityError:删除时外键冲突

Sql IntegrityError:删除时外键冲突,sql,database,django,postgresql,django-models,Sql,Database,Django,Postgresql,Django Models,我有订单和发货模式。装运有一个外键 class Order(...): ... class Shipment() order = m.ForeignKey('Order') ... 现在在我的一个视图中,我想删除order对象以及所有相关对象。所以我调用order.delete() 我有Django 1.0.4,PostgreSQL 8.4,我使用事务中间件,所以整个请求都包含在单个事务中 问题是,在order.delete()中,我得到: 我检查了connection.q

我有订单和发货模式。装运有一个外键

class Order(...):
   ...

class Shipment()
   order = m.ForeignKey('Order')
   ...
现在在我的一个视图中,我想删除order对象以及所有相关对象。所以我调用order.delete()

我有Django 1.0.4,PostgreSQL 8.4,我使用事务中间件,所以整个请求都包含在单个事务中

问题是,在order.delete()中,我得到:

我检查了connection.queries,确定正确的查询以正确的顺序执行。在django对订单行执行删除后,删除第一批装运:

{'time': '0.000', 'sql': 'DELETE FROM "main_shipment" WHERE "id" IN (17)'},
{'time': '0.000', 'sql': 'DELETE FROM "main_order" WHERE "id" IN (45)'}
外键在删除时没有任何操作(默认),并且最初被延迟。我不知道为什么外键约束冲突

我还尝试注册pre_delete信号,并在调用delete on order之前手动删除装运对象,但它导致了相同的错误

我可以在Postgres中更改此密钥的删除行为,但这只是一个黑客行为,我想知道是否有人对这里发生的事情有更好的了解

还有一个小细节,我的订单模型继承自购物车模型,所以它实际上没有id字段,而是购物车的id,在执行订单删除后,也有购物车上的删除,但它似乎无关?对于装运->订单问题,我在示例中对其进行了简化

详细信息:键(id)=(45)仍处于激活状态 参考表“主要装运”


仍有一条记录引用id 45。您以前确实删除了main_发货中的记录17,但可能还有其他记录。您必须删除主订单中id为45的主订单发货中的所有记录。如果没有,数据库将保护您不受数据损害。

我在psql控制台中尝试了这一点,得到了相同的结果,因此这完全是postgreql的问题。也许再见,我不知道延迟是如何工作的。你能提供相关的create table SQL吗?你为什么要删除有发货的订单?一般来说,这是你想失败的事情。你永远都不想删除实际发货。因为这个订单还没有提交。这是下单用例的一部分,当有人从订单中删除所有项目时,我只需删除订单并重定向回空购物车。ahhhhh:/I与它斗争了这么久,我才意识到在python代码的后面,在更高的代码块中,我有了shipping.save():/而且我在conn.querys输出中没有注意到它,因为它是在装运前打印的。调用save()。
{'time': '0.000', 'sql': 'DELETE FROM "main_shipment" WHERE "id" IN (17)'},
{'time': '0.000', 'sql': 'DELETE FROM "main_order" WHERE "id" IN (45)'}