代码之家  ›  专栏  ›  技术社区  ›  Nimish Bansal

标记为已删除(Django)(所有表中的标记)或(在一个表中)

  •  0
  • Nimish Bansal  · 技术社区  · 6 年前

    表A有两个或两个以上的外键,例如(B和c),B有两个其他外键(D,E),类似的,c在DB中也有几个外键

    我正在使用Django.和需要软删除。 因为当我使用on cascade delete时,它将删除表中链接到外键的所有其他记录。

    那么,处理这些事情的最佳方法是什么呢。我所做的是通过在all表中设置flag字段来模拟级联特性,当D、E中的记录被删除(或者flag被设置为False)时,B中的记录也会得到flag=False,最后是A

    如何使用递归方法实现前者。为了得到反向关系,我得到了 https://stackoverflow.com/a/42627288/7698247

    def deleteObject(a):
        print("deleting", a, a._meta.model)
        a.flag = False
        a.save()
        # a = myobject()
        b = [f for f in a._meta.model._meta.get_fields() if f.auto_created and not f.concrete]
        b = [el for el in b if type(el) != ManyToManyRel]
    
        model_names = [x.related_model for x in b]
    
        # print(model_names)
    
        accesor_names = [i.get_accessor_name() for i in b]
    
        # print(accesor_names)
    
        querysets = [a.__getattribute__(accesor_names[i]).all() for i in range(len(accesor_names))]
    
        # print(querysets)
    
        for queryset in querysets:
            for instance in queryset:
                try:
                    deleteObject(instance)
                except Exception as E:
                    print("error is ", E)
                    exc_type, exc_obj, exc_tb = sys.exc_info()
                    print("in line no", exc_tb.tb_lineno)
    

    1 回复  |  直到 6 年前
        1
  •  0
  •   Nick Chapman    6 年前

    signals 内置于Django。使用与删除相关的信号,您应该能够以一种更加优雅的方式实现您想要做的事情。