IntegrityError:删除时出现外键冲突

Luk*_*ski 5 sql database django postgresql django-models

我有订单和发货模型.装运有订购的外键.

class Order(...):
   ...

class Shipment()
   order = m.ForeignKey('Order')
   ...
Run Code Online (Sandbox Code Playgroud)

现在,在我的一个视图中,我想删除订单对象以及所有相关对象.所以我调用order.delete().

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

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

...
File "/usr/local/lib/python2.6/dist-packages/django/db/backends/__init__.py", line 28, in _commit
return self.connection.commit()

IntegrityError: update or delete on table "main_order" violates 
foreign key constraint "main_shipment_order_id_fkey" on table "main_shipment"
DETAIL:  Key (id)=(45) is still referenced from table "main_shipment".
Run Code Online (Sandbox Code Playgroud)

我在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)'}
Run Code Online (Sandbox Code Playgroud)

外键具有ON DELETE NO ACTION(默认值)并且最初是延迟的.我不知道为什么我会得到外键约束违规.

我还尝试注册pre_delete信号并在调用订单删除之前手动删除货件对象,但是它导致了同样的错误.

我可以在Postgres中更改此键的ON DELETE行为,但这只是一个黑客,我想知道是否有人更好地了解这里发生了什么.

还有一个小细节,我的订单模式从车模型继承,所以它实际上没有id字段,但cart_ptr_id和顺序执行这里还删除车后删除,但似乎不相关?发货 - >订单问题,所以我在示例中简化了它.

Fra*_*ens 5

详细信息:键 (id)=(45) 仍从表“main_shipment”中引用。

仍然有一条记录引用了 id 45。您之前确实删除了 main_shipment 中的记录 17,但可能还有其他记录。您必须删除 main_shipment 中引用 main_order 中 id 45 的所有记录。如果没有,数据库会保护您免于损害您的数据。