加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在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相同来“移动”相关对象.

我已经运行了几个测试,这似乎达到了我正在寻找的最少的代码,没有额外的安装.

希望这有助于某人,请随时指出我的答案中的任何潜在陷阱.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读