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)'}