2016-05-19 3 views
1

Предположим, у альбома есть песни.Django, post_delete, можно ли использовать обратную связь?

Когда песни удалены, я хотел бы обновить количество песен для объектов альбома.
(Давайте предположим, что мы храним количество песен в поле Database)

Безопасно ли делать

@receiver(post_delete, sender=Song) 
def set_song_count(sender, song, **kwargs): 
    song.album_set.update_song_count() 

песня ForeignKey в альбом. Нет M2M.

+0

Нам понадобится более подробная информация о связях между этими моделями. Есть ли, во всяком случае, участие ManyToMany? В этом случае в транзакции есть * неатомные аспекты *. Меня укусили на задницу не раз за м2м. –

+0

@PeterRowell no M2m. – eugene

+0

OK, тогда возникает вопрос: после удаления, является ли «песня» еще действительным объектом, чтобы сделать song.album_set.foo() включен? Рискованный. Объект, вероятно, все еще существует в памяти, но логический путь, который ORM использует для доступа к альбому, неясен. Я бы создал тестовую базу данных с этим простым случаем, а затем избил дерьмо из него и посмотрел, все ли работает так, как вы хотите. Удачи. Ps. Следите за временными окнами! –

ответ

0

Нет, это небезопасно. От documentation:

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

С этой точки зрения экземпляр ушел из базы данных. Попытка получить song.album_set будет (если она не была предварительно выбрана в другом месте, на которую вы не можете положиться) инициирует запрос базы данных для объектов, связанных с этим. Я не думаю, что вы получите ошибку, но поскольку объект больше не существует в базе данных, вы просто получите пустой результат.

Вы можете использовать сигнал pre_delete для запуска кода, который уменьшает счетчик для связанных альбомов. Вы также можете сделать это в методе deleteon the model itself.

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