替换相关对象的对象 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
将允许您将 First
、Second
等链接到相同的 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})
给定模型
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
将允许您将 First
、Second
等链接到相同的 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})