首页 > 解决方案 > Django:使用 .on_delete(SET_NULL) 级联,如何同时更改其他属性

问题描述

我觉得这应该很容易,但我似乎无法在文档中找到参考。

我有一个Resident具有 ForeignKey的 Django 模型Property,当/如果用户删除Property我已将删除级联设置为,SET_NULL因为我觉得最好不要破坏这些数据,因为可以审计客户端以获取有关以前居民的信息。

我的问题是,我拥有的地方和居民有一个居民搜索功能,它可以正常工作,但我今天注意到一个错误,即当删除一个属性时,每个关联条目仍然有一个活动属性设置为. 我还需要能够将属性设置为,这样那些居民就不能再登录系统,或者在我的搜索功能中显示活跃居民。activeinactiveResidenttrueResident.activefalse

除了在删除 a 时手动设置这些值之外,我该怎么做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)

标签: pythondjangopython-3.xcascade

解决方案


最简单的选择是覆盖模型delete中的方法Property并更改相关的活动字段Resident。但是,这与覆盖具有相同的问题save,主要是在批量删除或迁移中不调用此方法。https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

另一种选择是使用信号并收听pre_delete 或 post_delete

第三种选择是检查是否property_idNULL而不是使用活动字段。


推荐阅读