2015-05-06 2 views
1

Я вижу post_delete огнь по модели перед экземпляром фактически удаляется из базы данных, которая противоречит https://docs.djangoproject.com/en/1.6/ref/signals/#post-deleteКак удалить post_delete перед удалением в Django?

Обратите внимание, что объект больше не будет находиться в базе данных, так что будьте очень осторожны, что вы делаете с этим экземпляром.

Если посмотреть в базе данных, запись сохраняется, если повторный запрос с использованием ОРМ, запись возвращается, и эквивалентно, например:

>>> instance.__class__.objects.get(pk=instance.pk) == instance 
True 

я не имею много соответствующих код, чтобы показать, мой сигнал выглядит следующим образом:

from django.db.models.signals import post_delete, post_save 

@receiver(post_delete, sender=UserInvite) 
def invite_delete_action(sender, instance, **kwargs): 
    raise Exception(instance.__class__.objects.get(pk=instance.pk) == instance) 
  • Я удалить этот экземпляр непосредственно, это не отношение чего-то другого, что удаляется
  • Моя модель довольно нормально смотрит
  • Мой взгляд является родовым DeleteView
  • Я не нашел никаких транзакционных декораторов везде - которая была моя первая мысль о том, как это может происходить

Любой мысли о том, где я начну отлаживать, как это происходит? Кто-нибудь знает об этом как о известной ошибке, я не могу найти никаких билетов, описывающих какое-либо поведение, подобное этому, - также я уверен, что это работает, как и ожидалось, в других местах моего приложения, которые, по-видимому, не затронуты.

Если я разрешаю выполнение продолжить, экземпляр в конечном итоге удаляется ... так что это не похоже на то, что он присутствует, потому что он не может его удалить (достаточно уверен, что post_delete не должен срабатывать в этом случае).

+0

Какую базу данных вы используете? Я не могу воспроизвести в Django 1.7. Большие изменения в управлении транзакциями были сделаны в 1.6, поэтому у меня нет никаких объяснений. – Alasdair

+0

Можете ли вы разместить свои настройки БД? –

ответ

1

Я считаю, что то, что я вижу, связано с транзакционным поведением Django по умолчанию, когда изменения не выполняются до тех пор, пока запрос не будет завершен.

У меня действительно нет решения - я не вижу способа опросить состояние, когда экземпляр или запись были бы выполнены, как только транзакция будет завершена (или даже способ иметь видимость транзакции), ни любой простой способ предотвратить это поведение без существенного изменения способа запуска приложения.

Я предпочитаю игнорировать проблему на данный момент и не беспокоюсь о последствиях в моем случае использования, которые на самом деле не так уж и серьезны - я приветствую любые предложения относительно того, как правильно справляться с этим ,

Я запускаю более общий сигнал для регистрации активности в моем post_delete, а в слушателе для этого мне нужно проверить, удаляется ли экземпляр - в противном случае он связывает плохое GenericRelation, ссылающееся на pk, который не существует , то, что я намеревался сделать, это аннулировать его, если я вижу, что отношение удаляется, но, как описано, я не могу сказать в этот момент, если только я не должен был передавать дополнительный аргумент всякий раз, когда я запускаю сигнал внутри post_delete.

Смежные вопросы