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

时间:2018-10-22 14:14:14

标签: python django django-models

我正在一个项目中使用很多外键 表A有两个或两个以上的外键say(B和c),而表B有两个其他外键(D,E)类似,C在DB中也有几个外键

我正在使用Django。并希望进行软删除。 因为当我在层叠删除上使用时,它将删除链接到外键的表中的所有其他记录。

那么处理此类问题的最佳方法是什么。我所做的尝试是通过在所有表中创建标志字段来模拟级联功能,并且一旦D,E中的记录被删除(或将标志设置为False),B中的记录也将获得flag = False,从而最终得到A

我应该采用这种方法还是我必须在一个数据库中设置flag = False,并且每当标志是否为false时(对于链接到它的所有外键)都必须检查每个anf。我想我没有很好地解释问题,但希望您能理解我要说的话

我如何使用递归方法实现前者。为了获得反向关系,我得到了代码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)

这帮助我使用相同的功能从任何模型中删除任何对象并基于该标志过滤任何数据库

例如X.objects.filter(flag = True)

1 个答案:

答案 0 :(得分:0)

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