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

时间:2019-06-26 18:49:13

标签: python django data-migration

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

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

# -*- 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.

1 个答案:

答案 0 :(得分:1)

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