替换相关对象的对象 ID

Replace object id for related objects

给定模型

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_v2

我知道,我可以像这样Reference._meta.related_objects通过_meta得到Reference的所有相关模型。但是我不知道如何动态获取所有相关模型并将 ForeignKey 的值更改为新值。

您显然希望所有模型都与 "Main Reference" 保持链接,但要更改版本。将带有外键的 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})