В Django / South HOWTO создайте экземпляр модели из другого приложения во время DataMigration - PullRequest
7 голосов
/ 08 августа 2011

Мне нужно выполнить миграцию данных модели Ответ в приложении Вопрос .В этом сценарии есть такая зависимость, что мне нужно создать экземпляр модели Chapter , которая находится в приложении Journal .Итак, я кодировал его следующим образом:

def forwards(self, orm):
    for answer_object in orm.Answer.objects.all():

        #This Works.
        blog, is_created = orm['blog.Post'].objects.get_or_create(title=answer_object.answer[:100])
        blog.save()

        #This DOES NOT work
        chapter, is_created = orm['journal.Chapter'].objects.get_or_create(content_object=blog)
        chapter.save()
        #cleanup task, not relevant to this question below
        answer_object.chapter_ptr = chapter
        answer_object.save()

Но, как и ожидалось, это приводит к ошибке "orm ['journal.Chapter']. Objects.get_or_create (content_object = blog)", говоря, что

django.core.exceptions.FieldError: Cannot resolve keyword 'content_object' into field.

Это, вероятно, связано с тем, что content_object является GenericForeignKey, поэтому некоторые операции запрещены.Но я также попробовал другие альтернативы для создания объекта "главы", такие как

chapter = orm['journal.Chapter'](content_object=blog)
ERROR > TypeError: 'content_object' is an invalid keyword argument for this function

и

chapter = orm.journal.Chapter(content_object=blog)
 ERROR > AttributeError: The model 'journal' from the app 'questions' is not available in this migration. (Did you use orm.ModelName, not orm['app.ModelName']?)

Так в чем же я ошибаюсь?Любые указатели приветствуются.Спасибо.

ОБНОВЛЕНИЕ

Так как мой предыдущий подход не удался, я попробовал новый метод.Модель, экземпляр которой в моем коде был выше , то есть Chapter в приложении Journal , я решил вместо этого создать миграцию данных.Я также удостоверился в --freeze моделях, на которые я ссылаюсь в определении forwards.Теперь это должно было быть прямым, я думаю.У меня есть следующий код для пересылки:

def forwards(self, orm):

    for answer_object in orm['questions.Answer'].objects.all():

        #Works, AGAIN!
        blog, is_created = orm['blog.Post'].objects.get_or_create(title=answer_object.answer[:100])
        blog.save()

        # DOES NOT WORK, AGAIN!
        chapter = orm.Chapter(rank=1, content_object=blog)       
        chapter.save()

Я бы подумал, что сейчас, так как я создаю экземпляр модели ( Chapter ), которая существует в предметном приложении (Журнал ) все должно было сработать.Но я получаю ту же ошибку.

TypeError: 'content_object' is an invalid keyword argument for this function

Сбой в той же точке, а именно, "content_object".Я опубликую ниже определение модели, если это может помочь.

class Chapter(models.Model):

    rank = models.IntegerField()

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

ОБНОВЛЕНИЕ 2 Хотел добавить, что все модели, которые затрагиваются в этих методах перенаправления, а именно - блог, глава, вопросы;полностью определены в файлах 00n _ *. py, созданных схемами Юга.

Ответы [ 4 ]

8 голосов
/ 13 августа 2011

Получив помощь от Роба и ребят из групп пользователей South & Django, я смог решить эту проблему.Ниже приведено определение моего forwards сценария миграции данных.

def forwards(self, orm):

    for answer_object in orm['questions.Answer'].objects.all():


        blog, is_created = orm['blog.Post'].objects.get_or_create(title=answer_object.answer[:100])
        blog.save()

        #I have to manually lookup the content_type ans set it in the chapter creation.
        ct = orm['contenttypes.ContentType'].objects.get(app_label="blog", model="post")    
        chapter = orm.Chapter(rank=1, content_type=ct, object_id=blog.id)

        chapter.save()
1 голос
/ 08 августа 2011

Здесь уже было дано несколько ответов Django South: создание схемы миграции для более чем одного приложения

В основном юг в настоящее время не поддерживает несколько приложений.

Если вы не хотите запутывать свои приложения даже больше, чем они, я бы использовал быстрый SQL в db.execute как быстрое решение.

Похоже, что блог и журнал очень взаимосвязаны. Вы уверены, что хотите их в отдельных приложениях?

0 голосов
/ 21 октября 2014

Это комментарий к ответу Чанца, который отлично сработал для меня (у меня нет представителя, чтобы публиковать это в качестве комментария)

Чтобы сэкономить время другим, вам также нужно заморозить тип контентаприложение при создании миграции:

python manage.py datamigration yourapp migrationname --freeze contenttypes
0 голосов
/ 31 января 2014

Чтобы создать миграцию с помощью manage.py, передайте --freeze = other_app в качестве аргументов, чтобы добавить определения моделей этого other_app в саму миграцию.

...