python - 标记为已删除(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)
解决方案
您应该使用signals
内置的 Django。使用与删除相关的信号,您应该能够以更优雅的方式实现您想要做的事情。
推荐阅读
- node.js - 对话流集成。我该怎么做?
- ruby-on-rails-5.2 - 如何为 RSpec 帮助器规范存根 controller_name 方法?
- angular - Angular 开发模式在 Internet Explorer 11 中确实很慢(但在较新的浏览器中很好)
- python - Webscraping - TypeError:“NoneType”对象不可下标
- angular6 - 使用 Angular6 将 Excel Base 64 转换为 Excel
- html - 无法获取表单以验证所需的选择输入
- javascript - 不用搜索谷歌如何学习 Matplotlib ——
- webpack - Webpack ClosurePlugin - 闭包编译器中的错误:java.nio.file.InvalidPathException:非法字符 <:>
- php - 如果存在一行,则通过 PHP 站点插入到表中
- asp.net - ASP.NET MVC 应用程序在 IIS 中出现 404 错误,但相同代码库的不同分支可以工作,我可以在 Visual Studio 中运行它