在Django / South如何在数据迁移期间从不同的应用程序创建模型的实例

时间:2011-08-08 00:54:34

标签: django instantiation data-migration django-south generic-foreign-key

我需要在应用问题中执行模型答案的数据迁移。在该脚本中存在依赖性,因此我需要创建模型的实例,该实例位于应用期刊中。所以,我把它编码如下:

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']?)

那我哪里错了?任何指针赞赏。感谢。

更新

因为我早先的方法失败了,所以我尝试了一个新的方法。我的代码上面的实例化失败的模型,即 Journal 应用程序中的 Chapter ,我决定为此创建数据迁移。我还确保在--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() 。我想,这应该是直截了当的。我的正向代码如下 -

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

我原本以为现在因为我正在创建一个模型实例(),它存在于主题应用程序(期刊)中,所以应该已经解决了。但我得到了同样的错误。

class Chapter(models.Model):

    rank = models.IntegerField()

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

它在同一点失败,即“content_object”。如果可能有帮助,我会在模型定义下面发布。

{{1}}

更新2 想要在这些前向方法中添加所有被触及的模型,即 - 博客,章节,问题;在South的schemamigration创建的00n _ * .py文件中完全定义。

4 个答案:

答案 0 :(得分:8)

在获得Rob和南方人民的帮助之后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 :(得分:1)

在此之前已经回答过Django South: Creating schemamigration for more than one app

目前,南方目前不支持多种应用程序。

如果您不想将应用程序纠缠在一起,我会在db.execute中使用原始SQL作为快速修复。

看起来博客和期刊非常相互关联。您确定要在单独的应用程序中使用它们吗?

答案 2 :(得分:0)

要通过manage.py创建迁移,请将--freeze = other_app作为参数,将此other_app的模型定义添加到迁移本身。

答案 3 :(得分:0)

这是对Chantz答案的评论,对我来说非常有用(请不要让代表将此作为评论发布)

为了节省一些其他时间,您还需要在创建迁移时冻结contenttype应用程序:

python manage.py datamigration yourapp migrationname --freeze contenttypes