在Django中将字段从一个实例复制到另一个实例
发布时间:2020-12-20 13:45:46 所属栏目:Python 来源:网络整理
导读:我有以下代码,它将现有实例和副本或“归档”它放在另一个模型中,然后删除它,用草稿副本替换它. 现行守则 def archive_calc(self,rev_num,primary_field): model_a = Calc.objects.get(tag_number__tag_number = primary_field,revision_number = rev_num) #C
我有以下代码,它将现有实例和副本或“归档”它放在另一个模型中,然后删除它,用草稿副本替换它.
现行守则 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,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)) 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,getattr(model_c,field.name)) model_c.delete() 不幸的是,上述解决方案不起作用,它似乎忽略了副本并继续按照“当前代码”工作.如果我在model_c._meta.fi中的字段之后添加了model_a.save()…系统陷入循环并最终抛出cmp中超出的最大递归深度. 任何帮助都会像往常一样非常欣赏,如果我咆哮错误的树,请告诉我. 解决方法
经过大量的探索和阅读Django文档后,我想出了一个非常好的,简单的解决方案.
def archive_calc(self,primary_field): model_a = Calc.objects.get(calc_details__calc_serial_number = primary_field,revision_number = rev_num) model_b = CalcArchive() object_list_annual = model_a.calcreview_set.filter(calc__calc_details = primary_field) object_list_ageing = model_a.calcitem_set.filter(calc__calc_details = primary_field) for obj in object_list_annual: obj.calc_id = self.object.id obj.save() for obj in object_list_ageing: obj.calc_id = self.object.id obj.save() for field in model_a._meta.fields: setattr(model_b,field.name)) model_b.pk = None model_b.current_revision = False model_b.save() model_a.delete() 这通过将_id字段设置为与self.object.id相同来“移动”相关对象. 我已经运行了几个测试,这似乎达到了我正在寻找的最少的代码,没有额外的安装. 希望这有助于某人,请随时指出我的答案中的任何潜在陷阱. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |