在迁移过程中处理GenericRelation和GenricForeignKey

时间:2020-04-12 01:50:35

标签: django django-migrations django-contenttypes django-generic-relations

我有带有GenricForeigKey和GenericRelation字段的模型。

class Datasheet(models.Model):
    package1 = GenericRelation('PackageInstance')
    ...

class PackageInstance(models.Model):
    content_object = GenericForeignKey()
    object_id = models.PositiveIntegerField(null=True)
    content_type = models.ForeignKey(ContentType, null=True, on_delete=models.CASCADE)
    ....

我正在从其他模型进行迁移,在迁移过程中,我想创建新实例。

    for ds in Datasheet.objects.all():
        pi = PackageInstance.objects.create(content_object=ds)

但是这失败了

TypeError: DesignInstance() got an unexpected keyword argument 'content_object'

此外,ds.package1.all()也将失败。

AttributeError: 'Datasheet' object has no attribute 'package1'

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我做了一些研究,但没有找到我问题的直接答案。 要记住的最重要的一点是,模型方法在迁移中将不可用。这包括由“内容类型”框架创建的字段。但是,object_idcontent_type将在那里。

我的解决方案是简单地手动创建事物。

ContentType = apps.get_model('contenttypes', 'ContentType')

Datasheet = apps.get_model('api', 'Datasheet')
DatasheetContentType = ContentType.objects.get(model=Datasheet._meta.model_name, app_label=Datasheet._meta.app_label)

for ds in Datasheet.objects.all():
    di = DesignInstance.objects.create(object_id=ds.id, content_type=DatasheetContentType)