python - 数据迁移产生的 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.
解决方案
此错误的原因是您将迁移定义模型与应用程序定义模型混合在一起。具体来说,您User
从应用程序中导入您的模型,您将获得staffPosition
as 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 错误报告更加用户友好:)
推荐阅读
- node.js - create-react-app/express 代理错误:无法代理请求(ECONNRESET)
- python - 如何根据当前页面url更改django中的href?
- reactjs - 尽管在沙盒中有效,但国家端点没有返回任何内容
- python - 为什么这个插入二叉搜索树的python代码不起作用?
- html - 为什么有些网格项目出现乱序?
- java - 从数据库中读取 java.sql.Date 的 TimeZone 时,如何考虑它?
- c - 为 GTK 2.24 和 GTK 3 和 GTK 4 创建菜单栏
- rsync - 处理删除时双向同步
- django - 根据某些用户信息过滤 query_set 的最安全和最干燥的方法
- html - 使用按钮定位表单