数据迁移产生的 ValueError 必须是 "User" 实例,但它是?

Data Migration produces ValueError that must be "User" instance but it is?

我正在尝试向数据库中添加一名工作人员。我正在通过数据迁移来做到这一点。我可以通过迁移添加用户,但无法将其分配给我尝试创建的 StaffPosition 的 user_id。我得到的错误是一个 ValueError,它说我需要使用 "User" 实例,但我认为我正在这样做。

我已经使用 ipdb 对此进行了故障排除,并查看了某些属性的值。我也尝试过以不同的方式获取用户,例如使用 User 实例的 pk 或 id。我做的另一件事是注释掉 create_urechr_user 中除创建用户对象的部分之外的所有代码行。这样,我就能够成功地将用户添加到数据库中。但是我无法使我的 StaffPosition 的 user_id 成为 User.

# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2019-02-08 21:23
from __future__ import unicode_literals

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

def create_urechr_user(apps, schema_editor):
    staffPosition = apps.get_model("hr", "staffPosition")
    User.objects.create_user(
         username = "myName",
         password = "test",
         is_active = True,
         email = "",
    )
    staff = staffPosition.objects.get(pk = 95)
    user = User.objects.get(username = "myName")


    staffPosition.objects.create(
        parent_staff_position = staff,
        user_id = user,
        title = "Testing Title",
    )

class Migration(migrations.Migration):

    dependencies = [
        ('hr', '0003_add_verbose_name_20190213_1519'),
    ]

   operations = [
        migrations.RunPython(create_urechr_user),
    ]

ValueError: Cannot assign "<User: urechr>": "StaffPosition.user_id" must be a "User" instance.

出现此错误的原因是您将迁移定义的模型与应用程序定义的模型混合在一起。具体来说,您从应用程序导入您的 User 模型,并且您将 staffPosition 作为 apps.get_model.

您必须使用 apps.get_model 获取两个模型,而不是使用 from django.contrib.auth.models import User:

from django.conf import settings

def create_urechr_user(apps, schema_editor):
    staffPosition = apps.get_model("hr", "staffPosition")

    # Here we get the user model the right way
    User = apps.get_model(settings.AUTH_USER_MODEL)
    User.objects.create_user(
         username = "myName",
         password = "test",
         is_active = True,
         email = "",
    )
    staff = staffPosition.objects.get(pk = 95)
    user = User.objects.get(username = "myName")


    staffPosition.objects.create(
        parent_staff_position = staff,
        user = user,
        title = "Testing Title",
    )

您可以在此处阅读有关 AUTH_USER_MODEL 的信息:https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-AUTH_USER_MODEL

您也可以在 django bugtracker 中检查这张票,它与您的问题类似:https://code.djangoproject.com/ticket/29283

看起来有机会使 Django 错误报告更加用户友好:)