chan

朝生暮死不足笑 但悲百年不足道

【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)

评论
还没有评论
    发表评论 说点什么