Работа с GenericRelation и GenricForeignKey внутри миграций - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть модели с полями 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 голосов
/ 12 апреля 2020

Я провел небольшое исследование, но не нашел прямого ответа на свой вопрос. Важно помнить, что методы моделей не будут доступны при переносе. Сюда входят поля, созданные платформой Content Types. Тем не менее, object_id и content_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)
...