В 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") 

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

Это позволит избежать необходимости хранить одни и те же данные дважды. Сейчас у вас плохо нормализованная база данных, и это нужно исправить.

Вернуться на верх