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和顺序执行这里还删除车后删除,但似乎不相关?发货 - >订单问题,所以我在示例中简化了它.
详细信息:键 (id)=(45) 仍从表“main_shipment”中引用。
仍然有一条记录引用了 id 45。您之前确实删除了 main_shipment 中的记录 17,但可能还有其他记录。您必须删除 main_shipment 中引用 main_order 中 id 45 的所有记录。如果没有,数据库会保护您免于损害您的数据。
| 归档时间: |
|
| 查看次数: |
5353 次 |
| 最近记录: |