Django 迁移失败 - 无法查询“peterson”:必须是“用户”实例

Posted

技术标签:

【中文标题】Django 迁移失败 - 无法查询“peterson”:必须是“用户”实例【英文标题】:Django failing migration - Cannot query "peterson": Must be "User" instance 【发布时间】:2017-12-27 13:47:46 【问题描述】:

我使用的是 Django 1.9、Python 3.6。我进行此迁移是为了尝试为缺少用户配置文件的任何用户填写用户配置文件。

但我收到以下错误。

奇怪的是“用户”变量似乎是一个用户实例。

from __future__ import unicode_literals
from django.db import migrations
from django.contrib.auth.models import User


def create_missing_profiles(apps, schema_editor):
    UserProfile = apps.get_model("myapp", "UserProfile")
    for user in User.objects.all():
        UserProfile.objects.get_or_create(user=user)


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0004_auto_20170721_0908'),
    ]

    operations = [
        migrations.RunPython(create_missing_profiles),
    ]

错误:

ValueError:无法查询“peterson”:必须是“User”实例。

【问题讨论】:

您也应该通过get_model 获取用户,而不是导入它。 我想知道这一点。但是我该怎么称呼它呢?应用程序部分有什么? (也许将其作为答案提交?) apps.get_model("auth", "User")。我没有将其作为答案提交,因为这不是您的问题的原因;但以后可能会导致其他问题。 这实际上解决了我的问题。 【参考方案1】:

看起来我只需要像获取 UserProfile 一样获取用户:

User = apps.get_model("auth", "User")

感谢@Daniel Roseman

完整的工作代码:

from __future__ import unicode_literals
from django.db import migrations


def create_missing_profiles(apps, schema_editor):
    UserProfile = apps.get_model("myapp", "UserProfile")
    User = apps.get_model("auth", "User")
    for user in User.objects.all():
        UserProfile.objects.get_or_create(user=user)


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0004_auto_20170721_0908'),
    ]

    operations = [
        migrations.RunPython(create_missing_profiles),
    ]

【讨论】:

以上是关于Django 迁移失败 - 无法查询“peterson”:必须是“用户”实例的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.7 迁移挂起

在 Django 中使迁移有条件

Django 迁移失败

Django:迁移到 NullBooleanField 失败,IntegrityError“包含空值”

Django 迁移在 Heroku 中失败

在迁移文件中使用特定模型时,Django 测试失败