django 模型,外键上的 NOT NULL 约束失败,即使我把 null=True 放在我的模型类中也很困难

问题描述

我首先实现了用户模型和身份验证,并将一些用户添加数据库中。然后我在模型中添加了两个字段,“城市”和“公司”,并在它们之间设置了外键关系。如果我通过管理站点创建的用户没有公司/城市,那没关系,但是如果用户是使用表单创建的,我希望该字段是必需的。所以我设置了 null=True 和 blank=False。这是我完整的 models.py 文件

from django.db import models
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager
from django.core.validators import MinLengthValidator

class UserManager(BaseUserManager):
    def create_user(self,first_name,last_name,email,rollNo,password=None):
        if not email:
            raise ValueError("Users must have an email")
        if not rollNo:
            raise ValueError("Users must have a roll number")
        if not first_name:
            raise ValueError("Users must have a first name")
        if not last_name:
            raise ValueError("Users must have a last name")

        user = self.model(
                first_name=first_name,last_name=last_name,email=self.normalize_email(email),rollNo=rollNo
            )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self,is_current,password):
        user = self.model(
                is_current=is_current,first_name=first_name,password=password
            )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.set_password(password)
        user.save(using=self._db)
        return user

class Company(models.Model):
    name = models.CharField(max_length=50,default="NAME")
    people = models.ManyToManyField('Person',default=None,related_name='employes',null=True)

    def __str__(self):
        return self.name

class City(models.Model):
    name = models.CharField(max_length=50,default="NAME")
    companies = models.ManyToManyField(Company,related_name='located_at',null=True)
    people = models.ManyToManyField('Person',related_name='residents',null=True)

    def __str__(self):
        return self.name


class Person(AbstractBaseUser):
    first_name = models.CharField(max_length=15,default="NAME",null=False,blank=False)
    last_name = models.CharField(max_length=15,blank=False)
    email = models.EmailField(unique=True,blank=False)
    username = models.CharField(max_length=30,unique=True,null=True,blank=True)
    date_joined = models.DateTimeField(verbose_name='date_joined',auto_Now_add=True,blank=True)
    last_login = models.DateTimeField(verbose_name='last_login',blank=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_current = models.BooleanField(default=True)
    batch = models.IntegerField(null=True,blank=True)
    facebook_profile = models.URLField(null=True,blank=True)
    instagram_profile = models.URLField(null=True,blank=True)
    linkedin_profile = models.URLField(null=True,blank=True)
    city = models.ForeignKey(City,on_delete=models.CASCADE,blank=False)
    company = models.ForeignKey(Company,blank=False)
    first = 1
    second = 2
    third = 3
    fourth = 4
    YEAR_CHOICES = (
        (first,'first'),(second,'second'),(third,'third'),(fourth,'fourth')
    )
    year = models.IntegerField(choices=YEAR_CHOICES,blank=True)
    CSE = 'CSE'
    ECE = 'ECE'
    IT = 'IT'
    Branch_CHOICES = (
        (CSE,'CSE'),(ECE,'ECE'),(IT,'IT')
    )
    branch = models.CharField(max_length=3,choices=Branch_CHOICES,default="CSE",blank=True)
    rollNo = models.CharField(validators=[MinLengthValidator(5)],max_length=5,blank=True)

    image = models.URLField(blank=True,null=True)
    #content_type = models.CharField(max_length=256,help_text='The MIMEType of the file')

    USERNAME_FIELD = 'email'
    required_FIELDS = ['is_current','first_name','last_name']

    objects = UserManager()

    def __str__(self):
        return self.rollNo

    def has_perm(self,perm,obj=None):
        return self.is_admin

    def has_module_perms(self,app_label):
        return True

当我运行 makemigrations 时,一切正常。但是当我运行迁移时,我得到:

sqlite3.IntegrityError: NOT NULL 约束失败: new__network_person.city_id

我无法删除所有迁移并重新开始。有没有其他方法可以解决这个问题? 另外,我真的不明白为什么会发生这个异常,我已经设置了 null=True。如果有人可以解释发生此错误的原因,那将非常有帮助。正如我所说,我之前有一个带有 Person 模型的表,并且我添加了 City 和 Company 后记。

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)