IntegrityError: нарушение внешнего ключа на удаляет

У меня есть модель 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 и после УДАЛЯЮТ на порядке, выполняется существует, также УДАЛЯЮТ на корзине, но это кажется не связанным? к отправке-> заказывают проблему, таким образом, я упростил ее в примере.

5
задан Lukasz Korzybski 30 March 2010 в 09:54
поделиться

1 ответ

ДЕТАЛЬ: Ключ (id)=(45) по-прежнему ссылка из таблицы "main_shipment".

До сих пор существует запись, ссылающаяся на id 45. Вы удалили запись 17 в main_shipment раньше, но могут быть и другие. Вы должны удалить все записи в main_shipment со ссылкой на id 45 в main_order. Если нет, база данных защищает вас от причинения вреда вашим данным.

4
ответ дан 15 December 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: