bubublik
@bubublik

Корректный способ удаления обьектов в django при использовании many-to-many?

Есть две модели:
class Target(models.Model):
    created_dt = models.DateTimeField(auto_now_add=True)
    updated_dt = models.DateTimeField(auto_now=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='targets')
    title = models.CharField(max_length=200)
    live = models.ManyToManyField(LiveLot, related_name='targets', blank=True)

class Live(models.Model):
    created_dt = models.DateTimeField(auto_now_add=True)
    updated_dt = models.DateTimeField(auto_now=True)
    closed_dt = models.DateTimeField()


Как видно, связь между ними не обязательна. Но в случае необходимости она может быть.
Проблема возникает при удалении объекта Live, в случае, если он имеет связь с Target.
Удалять пробовал через обычный delete:
obj.delete()
Возникает ошибка
psycopg2.IntegrityError: update or delete on table "blabla" violates foreign key constraint "blablabla" on table "app_targe
t_lots"
DETAIL:  Key (id)=(32845) is still referenced from table "app_target_live"

Понятно, что ошибка целостности из-за присутствия неудаленной связи.
Решил ее вот так:
obj.targets.clear()
obj.delete()

Но может быть есть более красивый или корректный метод что бы при удалении, сразу удалялись и связи из промежуточной таблицы?
  • Вопрос задан
  • 1551 просмотр
Пригласить эксперта
Ответы на вопрос 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
В интернетах никаких полезных решений на эту тему не приводят, хотя на мой взгляд должен быть хотя бы абзац в документации Django. Одно из решение - сделать through-модель, в которой указать каскадное удаление явно в описании ForeignKey. Но при этом M2M поля начинают вести себя немного по-другому (касательно отправляемых сигналов и внешнего вида в админке). Я бы повесил зачистку m2m на pre_delete и не мучался.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы