首页 > 解决方案 > 标记为已删除(Django)(在所有表中标记)或(在一个中)

问题描述

我正在做一个经常使用外键的项目表A有两个或两个以上的外键说(B和c)和B有两个其他外键(D,E)类似C也有几个外键数据库中的键

我正在使用 Django.and 想要软删除。因为当我使用级联删除时,它将删除表中链接到外键的所有其他记录。

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

我应该更喜欢这种方法还是我必须在一个数据库中设置 flag = False 并且每次链接到它的所有外键的 tha 标志是否为假时都必须检查每个 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)

标签: pythondjangodjango-models

解决方案


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


推荐阅读