django - 如何在createsuperuser中实例化表

标签 django

我有两个表EmployeeSector,employee表的外键为Sector表的部门代码(sectorCode)属性。 Employee 表继承自AbstractBaseUser 类。 我想使用命令 python manage.py createsuperuser 创建一个 super 用户。 我收到错误:ValueError:无法分配“'Code1'”:“Employee.sectorCode”必须是“Sector”实例。 (我在Sector表中添加了一行NameSector1; Code1)

我输入这些值:

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

Error ...

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

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,
            <b>sectorCode_id=sectorCode</b>,
        )
        user.set_password(password)
        user.save()
        return user

    # …

如果您想创建一个扇区以防缺少扇区,您可以使用:

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.<b>get_or_create(</b>
            sectorCode=sectorCode, defaults={'nameSector': sectorCode}
        <b>)</b>

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

    # …
然而,

Code1无效,因为扇区代码的最大长度为三个字符。


Note: normally the name of the fields in a Django model are written in snake_case, not PascalCase, so it should be: first_name instead of firstName.

关于django - 如何在createsuperuser中实例化表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74293964/

相关文章:

python - 在 Django 1.3 中读取原始 HTTP 请求

python - Django Rest Framework SerializerMethodField 传递额外参数

jquery - 当 jQuery.post() 请求时,Django View 不会重定向

python - Ipython常见问题

mysql - 如何在 Queryset extra>select 中使用 SQL 通配符 %?

python - url 中省略的参数

Django 表单字段未显示

django 'Manager' 对象不可迭代(但代码在 manage.py shell 中有效)

python - 无法 pickle <type 'function' > : attribute lookup __builtin__. 函数失败

python - 在 Django Rest 框架分页中添加新值