我有以下代码,它采用现有实例并在另一个模型中复制或“存档”它,然后删除它,用草稿副本替换它。
当前代码
def archive_calc(self, rev_num, primary_field):
model_a = Calc.objects.get(tag_number__tag_number = primary_field, revision_number = rev_num) #Current Revision instance
model_b = CalcArchive() #Draft instance
#Copies data to archive model
for field in model_a._meta.fields:
setattr(model_b, field.name, getattr(model_a, field.name))
model_b.pk = None
model_b.current_revision = False
model_b.save()
model_a.delete()
这工作正常,但是我需要更改系统以允许某些具有外键的模型,因为当归档/删除实例时,相关记录也会随之删除。因此,我解决此问题的想法是将草稿记录中的更改复制到先前的记录,然后删除草稿,从而维护外键相关记录。
解决思路
def archive_calc(self, rev_num, primary_field):
model_a = Calc.objects.get(tag_number__tag_number = primary_field, revision_number = rev_num) #Current Revision instance
model_b = CalcArchive() #Archive Instance
model_c = Calc.objects.get(pk = self.object.pk) #Draft instance
#Copies data to archive model
for field in model_a._meta.fields:
setattr(model_b, field.name, getattr(model_a, field.name))
model_b.pk = None
model_b.current_revision = False
model_b.save()
#Copies data from draft instance to current revision instance
for field in model_c._meta.fields:
setattr(model_a, field.name, getattr(model_c, field.name))
model_c.delete()
不幸的是,上述解决方案不起作用,它似乎只是忽略了副本并继续按照“当前代码”工作。如果我添加model_a.save()
after for field in model_c._meta.fi...
系统陷入循环并最终抛出maximum recursion depth exceeded in cmp
.
与往常一样,任何帮助将不胜感激,如果我找错了树,请告诉我。