【SQL】关于逻辑删除
- 删除级别时,判断下属如果还有数据,则不允许被删除。
- 自动将级别设置为某个级别。
- 将级别设置为空。
比如有两个表,分别是级别表和客户表,两个表的删除,都是逻辑删除而非物理删除
其中,客户表中有个外键为级别
此时,删除级别,其有关联的客户数据,应该如何处理呢。
三种方式:
1.修改级别删除的逻辑,查询是否有关联的数据,有关联数据,不允许删除
2.将与级别相关联的客户设置为默认值,例如NULL
3.不做任何行为,后续客户查询就需要类似于如下查询
queryset = models.Customer.objects.filter(active=1,level_active=1)
————————————————-
注意:如果某个modelform涉及的下拉是个外键,且这个外键也使用了逻辑删除,需要在这个modelform对应的模型中,在这个使用了逻辑删除的外键字段,添加limit_choices_to来筛选未被逻辑删除的关联字段,否则,逻辑删除的字段值也会显示在下拉框中。
level = models.ForeignKey(verbose_name="级别", to="Level", on_delete=models.CASCADE,null=True,blank=True,limit_choices_to={'active':1})
------------------------------------------
另一种做法是,通过在ModelForm中,进行类似如下的操作来解决此问题
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
print(self.fields['level'].queryset)
self.fields['level'].queryset = models.Level.objects.filter(active=1)