首页 > 解决方案 > 数据迁移产生的 ValueError 必须是“用户”实例,但它是吗?

问题描述

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

我已经使用 ipdb 来解决这个问题,并查看一些属性的值是什么。我还尝试过以不同的方式获取用户,例如使用 User 实例的 pk 或 id。我做的另一件事是注释掉 create_urechr_user 中的所有代码行,除了创建 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.

标签: pythondjangodata-migration

解决方案


此错误的原因是您将迁移定义模型与应用程序定义模型混合在一起。具体来说,您User从应用程序中导入您的模型,您将获得staffPositionas 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 错误报告更加用户友好:)


推荐阅读