Python 在Django中将字段从一个实例复制到另一个实例

Python 在Django中将字段从一个实例复制到另一个实例,python,django,Python,Django,我有下面的代码,它获取一个现有实例并将其复制或“归档”到另一个模型中,然后将其删除并替换为草稿副本 当前代码 这很好,但是我需要更改系统,以允许使用外键的某些型号,因为当存档/删除实例时,相关记录会随之删除。因此,我的想法是将草稿记录中的更改复制到以前的记录中,然后删除草稿,从而维护与外键相关的记录 解决方案理念 不幸的是,上述解决方案不起作用,它似乎忽略了副本,并继续按照“当前代码”工作。如果我在model_c.\u meta.fi中的字段的之后添加model_a.save(),系统陷入循环,

我有下面的代码,它获取一个现有实例并将其复制或“归档”到另一个模型中,然后将其删除并替换为草稿副本

当前代码

这很好,但是我需要更改系统,以允许使用外键的某些型号,因为当存档/删除实例时,相关记录会随之删除。因此,我的想法是将草稿记录中的更改复制到以前的记录中,然后删除草稿,从而维护与外键相关的记录

解决方案理念

不幸的是,上述解决方案不起作用,它似乎忽略了副本,并继续按照“当前代码”工作。如果我在model_c.\u meta.fi中的字段的
之后添加
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()