我有兩個表Employee和Sector ,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 ...
如何在對話框中實體化扇區類?
模型.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"
uj5u.com熱心網友回復:
如果您知道該行業的存在,您可以與:
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以防丟失,您可以使用:
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但是將無效,因為扇區代碼的最大長度為三個字符。
注意:通常 Django 模型中的欄位名稱是用snake_case撰寫的,而不是PascalCase,所以它應該是:
first_name而不是.firstName
uj5u.com熱心網友回復:
您可以首先確保您的資料庫與您的模型同步...
例如:
$ django-admin.py migrate --fake-initial ...
$ django-admin.py createsuperuser bob
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/526081.html
標籤:django
下一篇:為什么以及如何將Djangofilter-byBooleanField查詢轉換為SQLWHERE或WHERENOT而不是1/0?
