Python GenericForeignKey数据迁移错误:';内容对象';是无效的关键字参数

Python GenericForeignKey数据迁移错误:';内容对象';是无效的关键字参数,python,django,django-migrations,generic-foreign-key,Python,Django,Django Migrations,Generic Foreign Key,我想为具有GenericForeignKey关系的模型(Comment)创建数据迁移。我的模型是根据for制作的 型号: ... class NiceMeme(models.Model): """ Example model. """ name = models.CharField(max_length=140) image = models.ImageField(upload_to=get_path_to_store_nice_meme_ima

我想为具有
GenericForeignKey
关系的模型(
Comment
)创建数据迁移。我的模型是根据for制作的

型号:

...
class NiceMeme(models.Model):
    """
        Example model.
    """

    name = models.CharField(max_length=140)
    image = models.ImageField(upload_to=get_path_to_store_nice_meme_images)


class Comment(models.Model):
    """
        Model to add comments to any other (non abstract) model.
    """
    ...
    user = models.ForeignKey(ExtendedUser)
    content = models.CharField(max_length=140)
    content_type = models.ForeignKey(ContentType)
    object_pk = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_pk')
数据迁移

...
def create_comment(apps, schema_editor):
    ...
    nice_meme = NiceMeme.objects.create(name='Nice nice meme')
    Comment.objects.create(
        user=user,
        content='Gott ist tot',
        poster_username='Friedrich',
        content_object=nice_meme
    )

...
operations = [
    migrations.RunPython(create_comment)
]
当我运行
/manage.py migrate
时,我得到:

TypeError:“content\u object”是此函数的无效关键字参数

我不得不说,我在视图中使用了与
create\u comment
相同的代码,并且运行良好

我正在使用django 1.7.7。我不在南方

编辑: 我试过尚旺的答案

Comment.objects.create(
    user=user,
    content='Gott ist tot', 
    poster_username='Friedrich',
    content_type=ContentType.objects.get_for_model(nice_meme),
    object_pk=nice_meme.id
) 
也不起作用:

ValueError: Cannot assign "<ContentType: nice meme>": "Comment.content_type"  must be a "ContentType" instance.
ValueError:无法分配“”:“Comment.content\u type”必须是“ContentType”实例。
请尝试以下操作:

from django.contrib.contenttypes.models import ContentType

nice_meme = NiceMeme.objects.create(name='Nice nice meme')
Comment.objects.create(user=user,
                       content='Gott ist tot', 
                       poster_username='Friedrich',
                       content_type=ContentType.objects.get_for_model(nice_meme),
                       object_pk=nice_meme.id)
我认为问题在于,您的
content\u对象
字段只是您的
注释
模型对象快速访问外键的一种简单方式,如:

obj = some_comment.content_object
它不是一个实际的字段,而是两个字段的组合,因此不能直接为它指定一个
nicemome
对象

编辑:

听起来你在使用South,这里描述了一个问题。解决方案在另一个SO中得到了回答。听起来解决方案是冻结与迁移相关的任何模型:

python manage.py schemamigration --auto yourapp --freeze contenttypes
您可能需要冻结更多应用程序:

python manage.py schemamigration --auto yourapp --freeze contenttypes --freeze someotherapp ...

我以前从未遇到过这个问题,所以请阅读原始帖子了解更多详细信息,希望这能有所帮助。

正如我所说,我也遇到过同样的问题,一位同事帮我提供了以下提示:

你确实需要设置
content\u-type
object\u-pk
,正如+Shang-Wang所指出的,但是
ContentType
必须使用
apps加载。获取\u-model
而不是直接导入它

所以用这个:

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

在您的迁移方法中,所有这些都应该起作用:)


我也遇到了同样的问题,解决方案是获取模型名为小写的ContentType对象:

content=ContentType.objects.get(app_label='appname', model='modelname')
关于这个问题:

def create_comment(apps, schema_editor):
    ContentType = apps.get_model('contenttypes', 'ContentType')    
    nice_meme = NiceMeme.objects.create(name='Nice nice meme')

    Comment.objects.create(
        user=user,
        content=ContentType.objects.get(app_label='appname', model='nicememe')
        poster_username='Friedrich',
        content_object=nice_meme
    )

谢谢你的回答。不幸的是,我得到了以下信息:
ValueError:cannotassign”“:“Comment.content\u type”必须是一个“ContentType”实例。
我更新了我的答案,我没有足够的知识来处理这个问题,但请尝试我找到的线程,看看是否有帮助。我不使用south,我使用django 1.7.7。很抱歉告诉你到现在为止。谢谢你的帮助。我也有同样的问题,使用Django 1.8.3:/你检查了答案吗?对不起。我正在度假。几小时后我会看的。谢谢你,他不是那样工作的
ContentType.objects
实际上是
django.db.models.manager.manager
所以我做的是:
nice\u meme\u ContentType=ContentType.objects.get(app\u label='comments',model='niceme')
model name必须是小写的。现在开始工作:)奇怪的拉拉契查罗。。。您是否使用apps.get\u模型加载ContentType?我很高兴你解决了你的问题,顺便说一句:)救了我一天。谢谢
def create_comment(apps, schema_editor):
    ContentType = apps.get_model('contenttypes', 'ContentType')    
    nice_meme = NiceMeme.objects.create(name='Nice nice meme')

    Comment.objects.create(
        user=user,
        content=ContentType.objects.get(app_label='appname', model='nicememe')
        poster_username='Friedrich',
        content_object=nice_meme
    )