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