我每年有很多对象,并想使用适当的外键将其中一个复制到新的一年。下面的实现模型链接到许多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
但是必须有更好的方法。
也许有完全更好的方法来制作此副本?
答案 0 :(得分:0)
据我所知:
thisyear
年开始获取所有实现,并为每个实现创建副本,并以新的一年nextyear
。据我所知,您无需搜索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