Python 在Django中将字段从一个实例复制到另一个实例
我有下面的代码,它获取一个现有实例并将其复制或“归档”到另一个模型中,然后将其删除并替换为草稿副本 当前代码 这很好,但是我需要更改系统,以允许使用外键的某些型号,因为当存档/删除实例时,相关记录会随之删除。因此,我的想法是将草稿记录中的更改复制到以前的记录中,然后删除草稿,从而维护与外键相关的记录 解决方案理念 不幸的是,上述解决方案不起作用,它似乎忽略了副本,并继续按照“当前代码”工作。如果我在model_c.\u meta.fi中的字段的Python 在Django中将字段从一个实例复制到另一个实例,python,django,Python,Django,我有下面的代码,它获取一个现有实例并将其复制或“归档”到另一个模型中,然后将其删除并替换为草稿副本 当前代码 这很好,但是我需要更改系统,以允许使用外键的某些型号,因为当存档/删除实例时,相关记录会随之删除。因此,我的想法是将草稿记录中的更改复制到以前的记录中,然后删除草稿,从而维护与外键相关的记录 解决方案理念 不幸的是,上述解决方案不起作用,它似乎忽略了副本,并继续按照“当前代码”工作。如果我在model_c.\u meta.fi中的字段的之后添加model_a.save(),系统陷入循环,
之后添加model_a.save()
,
系统陷入循环,并最终抛出超出cmp的最大递归深度
任何帮助都会像往常一样感激,如果我找错了人,请告诉我
obj = Model.objects.get(pk=1)
obj.pk = get_unused_pk()
obj.save()
您只需要更改主键(我不知道应该如何在数据库模式中对其求值)并保存模型实例。听起来您想“深度复制”模型实例
我们应该做到这一点
它看起来像是复制了外键,但不是很多领域,希望这对您来说没问题:
对于深度重置,将遍历并重置直接外键。
不尝试重置多对多和反向外键
因为相关对象之间的比较用于参考和
例如,相关对象变得不明确
经过大量的闲逛和阅读Django文档,我找到了一个非常好、简单的解决方案
def archive_calc(self, rev_num, 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, getattr(model_a, field.name))
model_b.pk = None
model_b.current_revision = False
model_b.save()
model_a.delete()
通过将\u id
字段设置为与self.object.id
相同,可以“移动”相关对象
我已经运行了几个测试,这似乎完全实现了我所期望的,只需要很少的代码,没有额外的安装
希望这对某人有所帮助,请随时指出我回答中的任何潜在缺陷。谢谢您的评论。我需要更改哪个实例?我已尝试将“草稿”实例的“pk”设置为“当前版本”中的“pk”,但相关对象/记录仍被删除。这不会复制不同模型上的关系,也就是相关字段。谢谢,我正在查看深度复制,但看不出它将如何工作。我刚下载了Forkit,所以我会让你知道我是怎么做的,但是文档似乎有点单薄!:)如果它不能提供您所需的内容,请尝试以下线程:可能重复:可能重复
obj = Model.objects.get(pk=1)
obj.pk = get_unused_pk()
obj.save()
def archive_calc(self, rev_num, 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, getattr(model_a, field.name))
model_b.pk = None
model_b.current_revision = False
model_b.save()
model_a.delete()