В django как удалить строковое значение, хранящее id родителя, из дочерней таблицы при удалении родителя в M2M отношениях?
Я сохраняю некоторые значения из родительской таблицы в дочерней таблице в виде csv в символьном поле. Проблема в том, что при удалении родителя, хотя m2m-отношение удаляется, значение, которое было выбрано в строке дочерней таблицы, остается как есть. Как мне с этим бороться? Придется ли мне запускать метод post_save на родителе, чтобы получить доступ ко всем дочерним строкам и удалить оттуда значение. Будет много проблем с производительностью.
eg:
class Child1(models.Model):
name = models.CharField(max_length=30, unique=True)
class Teacher1(models.Model):
name = models.CharField(max_length=30, unique=True)
children = models.ManyToManyField(
Child1,
blank=True,null=True,
related_name='children')
child_list = models.CharField(max_length=500, unique=True)
Выше, список child_list заполняется именами детей в формате CSV, когда дети выбираются в Teacher1Admin в файле admin.py. Но когда любой ребенок удаляется, хотя соответствующие отношения удаляются, имя ребенка остается в таблице Teacher в списке child_list. Как это можно убрать, всякий раз, когда таблица Child1 редактируется/удаляется ребенок, без значительного увеличения производительности?
Идеальное решение - удалить child_list
из класса Teacher1
и просто использовать children
для получения имен связанных дочерних элементов.
Если вы настаиваете на сохранении child_list
, вам просто нужно разобрать значение, удалить дочернее и затем обновить поле. Это может выглядеть примерно так:
def remove_from_teacher(teacher, name):
names = teacher.child_list.split(',')
names.remove(name)
teacher.child_list = ','.join(names)
teacher.save()
Удалите child_list
из модели, а вместо этого добавьте свойство.
class Teacher1(models.Model):
name = models.CharField(max_length=30, unique=True)
children = models.ManyToManyField(
Child1,
blank=True,null=True,
related_name='children')
@property
def child_list(self):
return self.children.values("name")
Возможно, вы могли бы сделать это свойство кэшируемым для повышения производительности.
Это позволит избежать необходимости хранить одни и те же данные дважды. Сейчас у вас плохо нормализованная база данных, и это нужно исправить.