替换相关对象的对象ID

时间:2018-04-12 14:31:45

标签: django django-orm

鉴于模特

start

我不知道有多少型号可以参考。 ForeignKeys和相关名称可以不同。

现在我将创建下一个参考版本。

<img src="https://dummyimage.com/800x400/000/fff&text=large-src" srcset=" https://dummyimage.com/270x400/000/fff&text=small 270w, https://dummyimage.com/650x400/000/fff&text=medium 650w, https://dummyimage.com/800x400/000/fff&text=large 800w, https://dummyimage.com/1600x400/000/fff&text=xlarge 1600w" sizes="100%" alt="test">

我需要与class Reference(models.Model): name = models.TextField() version = models.PositiveSmallIntegerField() ... class First(models.Model): special_reference = models.ForeignKey(Reference, related_name='first_references') ... class Second(models.Model): not_special_reference = models.ForeignKey(Reference, related_name='second_references') ... class Third(models.Model): very_special_reference = models.ForeignKey(Reference, related_name='third_references') ... ref_v1 = Reference(name="Main Reference", version=1).save() first = First(reference_id=ref_v1.id).save() second = Second(reference_id=ref_v1.id).save() third = Third(reference_id=ref_v1.id).save() 相关的第一,第二和第三模型的所有创建对象都改变与ref_v2 = Reference(name="Main Reference", version=2).save()的关系。

我知道,我可以像ref_v1那样获得ref_v2Reference的所有相关模型。但我无法弄清楚如何动态获取所有相关模型并将ForeignKey的值更改为新模型。

1 个答案:

答案 0 :(得分:1)

您显然希望所有模型都与#34; Main Reference&#34;保持联系,但更改版本。将带有ForeignKey的Version模型添加到Reference,可以将FirstSecond等保持链接到同一Reference,然后更新版本。如果您只想做,或者即使您需要更新更多字段,那么只要您更改引用,这似乎比浏览所有相关对象要好。

那就是说,如果你真的想这样做,一旦你有Reference._meta.related_objects,你可以迭代它们,然后这应该有效:

for related_object in Reference._meta.related_objects:
    model = related_object.related_model
    field = related_object.field.name
    model.objects.filter(**{field: ref_v1}).update(**{field: ref_v2})