У меня есть модель Order и Shipment. Отправка имеет внешний ключ для Упорядочивания.
class Order(...):
...
class Shipment()
order = m.ForeignKey('Order')
...
Теперь в одном из моих представлений я хочу, действительно удаляют объект порядка наряду со всеми связанными объектами. Таким образом, я вызываю 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".
Я зарегистрировался в 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)'}
Внешний ключ имеет НА, УДАЛЯЮТ NO ACTION (значение по умолчанию), и первоначально задерживается. Я не знаю, почему я получаю ограничительное нарушение внешнего ключа.
Я также пытался зарегистрировать сигнал pre_delete и вручную удалить объекты отправки, прежде чем удалят на порядке, назван, но он привел к той же ошибке.
Я могу измениться НА, УДАЛЯЮТ поведение для этого ключа в Пост-ГРЭС, но это был бы просто взлом, интересно, есть ли у кого-либо лучшая идея, что продолжается здесь.
Существует также маленькая деталь, моя модель Order наследовалась модели Cart, таким образом, она на самом деле не имеет идентификационного поля, но cart_ptr_id и после УДАЛЯЮТ на порядке, выполняется существует, также УДАЛЯЮТ на корзине, но это кажется не связанным? к отправке-> заказывают проблему, таким образом, я упростил ее в примере.
ДЕТАЛЬ: Ключ (id)=(45) по-прежнему ссылка из таблицы "main_shipment".
До сих пор существует запись, ссылающаяся на id 45. Вы удалили запись 17 в main_shipment раньше, но могут быть и другие. Вы должны удалить все записи в main_shipment со ссылкой на id 45 в main_order. Если нет, база данных защищает вас от причинения вреда вашим данным.