使用Django中的外键复制数据库的一部分

时间:2018-06-25 19:10:08

标签: django

我每年有很多对象,并想使用适当的外键将其中一个复制到新的一年。下面的实现模型链接到许多Moments,当我制作新副本时,我想“保持”新Moment与新实现之间的联系。

根据我在Internet上的发现,我正在处理以下代码:

realis_lista = Realisering.objects.filter(year=thisyear).all()
for obj in realis_lista:
    new_obj = obj
    moment = Moment.objects.filter(realisering__pk=obj.pk).all()
    new_obj.pk = None
    new_obj.year = nextyear
    new_obj.save()

    if moment:
        for mom in moment:
            new_mom = mom
            new_mom.pk = None
            new_mom.realisation = ??new_obj??

最后一行应该是什么?我需要找到new_obj的保存位置(它的pk),但是我唯一的想法是使用类似的

n_obj = 
Realisering.objects.filter(year=nextyear).filter(period=obj.period)....    
new_mom.realisation=n_obj 

但是必须有更好的方法。

也许有完全更好的方法来制作此副本?

1 个答案:

答案 0 :(得分:0)

据我所知:

  • 您的时刻模型具有实现模型的外键。
  • 您从thisyear年开始获取所有实现,并为每个实现创建副本,并以新的一年nextyear
  • 对于每个实现,请复制与之关联的Moment副本(如果有),然后将新的Realization副本分配给此Moment副本。

据我所知,您无需搜索new_obj的保存位置,就可以在代码中找到它。

我认为您应该尝试

for obj in Realisering.objects.filter(year=thisyear).all():
    # .first() will return None if it doesn't find it
    moment = Moment.objects.filter(realisering__pk=obj.pk).first() 
    obj.year = nextyear
    # The my_object.pk = None and my_object.save() combinaison will generate a new instance
    obj.pk = None
    obj.save()
    # obj is now the copy of the object

    if moment:
        moment.pk = None
        # We assign the Realisation copy to the Moment copy
        moment.realisation = obj
        moment.save()

请注意,如果模型使用继承,ManyToMany字段或OneToOne字段,则必须采取其他预防措施:https://docs.djangoproject.com/en/2.0/topics/db/queries/#copying-model-instances