我有两个表EmployeeSector,Employee表的外键是Sector表的扇区代码(SectorCode)属性.Employee表继承自AbstractBaseUser类. 我想用命令python manage.py createsuperuser创建一个超级用户. 我收到一个错误:ValueError: Cannot assign "'Code1'": "Employee.sectorCode" must be a "Sector" instance. (我在Sector表中增加了第NameSector1; Code1行)

我输入以下值:

λ python manage.py createsuperuser
registrationNumber: 001
Name: TestN1
FirstName: TestFN1
sectorCode: Code1
Password: ...

Error ...

如何在对话框中实例化Sector类?

models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class MyUserManager(BaseUserManager):
    
    def create_user(self, registrationNumber, firstName, name, sectorCode, password=None):
        if not firstName: raise ValueError("firstName required")
        if not name: raise ValueError("name required")
        if not registrationNumber: raise ValueError("registrationNumber required")
        if not sectorCode: raise ValueError("sectorCode required")
        
        user=self.model(firstName = firstName, name = name, registrationNumber = registrationNumber, sectorCode = sectorCode)
        user.set_password(password); user.save()
        return user
    
    def create_superuser(self, firstName, name, registrationNumber, sectorCode, password=None):
        user=self.create_user(firstName = firstName, name = name, registrationNumber = registrationNumber, sectorCode = sectorCode, password = password)
        user.is_admin=True; user.is_superuser=True
        user.save()
        return user

class Sector(models.Model):
    nameSector = models.CharField(verbose_name = "nameSector", max_length=50)
    sectorCode = models.CharField(verbose_name = "sectorCode", max_length=3, primary_key=True)
    
    class Meta: db_table = "Sector"
    
class Employee(AbstractBaseUser):
    firstName = models.CharField(verbose_name = "firstName", max_length=20)
    name = models.CharField(verbose_name = "name", max_length=20)
    registrationNumber = models.CharField(verbose_name="registrationNumber", max_length=20, primary_key=True)
    sectorCode = models.ForeignKey(Sector, on_delete=models.CASCADE)
    
    USERNAME_FIELD="registrationNumber"
    REQUIRED_FIELDS = ["name", "firstName", "sectorCode"]
    objects = MyUserManager()
    class Meta: db_table = "Employee"

推荐答案

如果您知道地段存在,则可以使用:

class MyUserManager(BaseUserManager):
    def create_user(
        self, registrationNumber, firstName, name, sectorCode, password=None
    ):
        if not firstName:
            raise ValueError("firstName required")
        if not name:
            raise ValueError("name required")
        if not registrationNumber:
            raise ValueError("registrationNumber required")
        if not sectorCode:
            raise ValueError("sectorCode required")

        user = self.model(
            firstName=firstName,
            name=name,
            registrationNumber=registrationNumber,
            sectorCode_id=sectorCode,
        )
        user.set_password(password)
        user.save()
        return user

    # …

如果要在缺少Sector的情况下创建Sector,则可以使用:

class MyUserManager(BaseUserManager):
    def create_user(
        self, registrationNumber, firstName, name, sectorCode, password=None
    ):
        if not firstName:
            raise ValueError("firstName required")
        if not name:
            raise ValueError("name required")
        if not registrationNumber:
            raise ValueError("registrationNumber required")
        if not sectorCode:
            raise ValueError("sectorCode required")

        sector, __ = Sector.objects.get_or_create(
            sectorCode=sectorCode, defaults={'nameSector': sectorCode}
        )

        user = self.model(
            firstName=firstName,
            name=name,
            registrationNumber=registrationNumber,
            sectorCode=sector,
        )
        user.set_password(password)
        user.save()
        return user

    # …

然而,Code1将是有效的not,因为扇区代码的最大长度为三个字符.


Note:通常情况下,Django模型中的字段名称是用snake_case编写的,而不是PascalCase,所以应该是:first_name而不是firstName.

Django相关问答推荐

以特定顺序获取模型实例时出现问题

如何使用Django';S生成的字段来统计相关对象?

Django:作为模型中的列表元素的字段

Django Form标签和action属性

Django allauth 社交帐户注册中邮箱的模板变量

ModuleNotFoundError:没有名为guardian.shortcuts的模块

如何在 Django 模型中存储元组列表

在 python 视图中检测移动浏览器

Django Rest Framework 中的 to_representation() 可以访问普通字段吗

Django:在模板中呈现表单字段时添加 CSS 类

用于测试文件下载的 Django 单元测试

virtualenv(python3.4), pip install mysqlclient 错误

Django:创建索引:非唯一,多列

Django - 来自 QuerySet 的唯一列表

Python Django:您正在使用 staticfiles 应用程序而没有设置 STATIC_ROOT 设置

如何在 Django 中触发 500 错误?

Django - 配置不当:模块django.contrib.auth.middleware

在 Celery 任务中运行 Scrapy 蜘蛛

Django - 在设置中使用反向 url 映射

Django 模型(1054,Unknown column in 'field list')