Django: Использование .on_delete (SET_NULL) Cascade, как одновременно изменить другой атрибут - PullRequest
0 голосов
/ 07 мая 2019

Мне кажется, что это должно быть легко, но я не могу найти ссылку в документах.

У меня есть Django Model Resident, которая имеет ForeignKey Property, когда / если пользователь удаляетчто Property Я установил удаление Каскад на SET_NULL, потому что считаю, что лучше не уничтожать эти данные, так как клиент может пройти аудит для получения информации о предыдущих жителях.

Моя проблема в том, что есть функция Поиск жильцов , где у меня есть active и inactive Резиденты, она работает правильно, но я заметил сегодня ошибку, что когда свойство удаляетсякаждая связанная запись Resident все еще имеет атрибут active , установленный на true.Мне нужно иметь возможность установить для атрибута Resident.active значение false, чтобы эти жители больше не могли входить в систему или отображаться в моей функции поиска для активных жителей..

Как это сделать, кроме ручной установки этих значений при удалении Property?

Вот соответствующая часть моей модели в случае необходимостиэто:

class Resident(models.Model):

    property_id = models.ForeignKey('Property', null=True,
                   on_delete=models.SET_NULL, db_column='property_id')

    active = models.IntegerField(default=1)

1 Ответ

0 голосов
/ 07 мая 2019

Самый простой вариант - переопределить метод delete в модели Property и изменить там активное поле соответствующего Resident. Однако это имеет те же проблемы, что и переопределение save, главным образом из-за того, что этот метод не вызывается при массовом удалении или миграции. https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

Другим вариантом будет использование сигналов и прослушивание pre_delete или post_delete

И третий вариант - проверить, является ли property_id значением NULL вместо использования активного поля.

...