首页 > 解决方案 > django:外键约束失败

问题描述

在我的 django 项目中,当我尝试添加教员时,它会引发“FOREIGN KEY constraint failed”错误。在这里,我试图保存学院下的教职员工,并且所有角色都有一个用户登录名,该登录名与一对一字段 models.py 链接:

class CustomUser(AbstractBaseUser):
    is_admin = models.BooleanField(default=False)
    is_institute = models.BooleanField(default=False)
    is_faculty = models.BooleanField(default=False)
    is_student = models.BooleanField(default=False)
    user_email = models.EmailField(verbose_name='Email',primary_key=True,unique=True)
    date_created = models.DateTimeField(verbose_name='date created', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)
    user_image = models.ImageField(upload_to='profile_images',null=True,blank=True)


    USERNAME_FIELD = 'user_email'

class Institute(models.Model):
    user = models.OneToOneField('CustomUser',primary_key=True,on_delete=models.CASCADE)
    institute_name = models.CharField(max_length=75,verbose_name="Institute Name",null=True,blank=True)
    institute_address = models.TextField(max_length=100,verbose_name="Address",null=True,blank=True)
    institute_number = models.PositiveBigIntegerField(verbose_name="Mobile Number",null=True,blank=True)
    institute_id = models.IntegerField(unique=True,verbose_name="Institute Id",null=True,blank=True)

class Faculty(models.Model):
    user = models.OneToOneField('CustomUser',primary_key=True,on_delete=models.CASCADE)
    faculty_id = models.CharField(max_length=75,verbose_name="Faculty Id",null=True,blank=True)
    first_name = models.CharField(max_length=75,verbose_name="First Name",null=True,blank=True)
    last_name = models.CharField(max_length=75,verbose_name="Last Name",null=True,blank=True)
    faculty_number = models.PositiveIntegerField(verbose_name="Mobile Number",null=True,blank=True)
    institute = models.ForeignKey('Institute',on_delete=models.CASCADE)
    class Meta:
        unique_together = [['faculty_id','institute']]

views.py 添加教师功能:

def addFaculty(request):
    if request.method == "POST":
        user  = CustomUser.objects.create_user(user_email=request.POST.get('user_email'),role="faculty",password=request.POST.get('password'))
        user.save()
        Faculty.objects.create(user=user,faculty_id=request.POST.get('faculty_id'),faculty_number=request.POST.get('faculty_number'),first_name=request.POST.get('first_name'),last_name=request.POST.get('last_name'),institute=Institute(user=request.user)).save()
        return redirect('dashboard')
    else:
        extraFields = [
            {
                'label':"First Name",
                'name':'first_name',
                'type':'text'
            },
            {
                'label':"Last Name",
                'name':'last_name',
                'type':'text'
            },
            {
                'label':"Faculty Id",
                'name':'faculty_id',
                'type':'number'
            },
            {
                'label':"Faculty Number",
                'name':'faculty_number',
                'type':'number'
            }
        ]
        return render(request,'learnerApp/addUser.html',context={'extraFields':extraFields})

标签: pythondjangodatabasesqlitedjango-models

解决方案


您尝试在创建Faculty实例时像这样指定机构:

Faculty.objects.create(..., institute=Institute(user=request.user)).save()

这不起作用,因为您提供的实例没有保存到它刚刚在 python 中创建的数据库中。事实上,这种写代码的方式可以说是有些糟糕,因为一行代码同时做多件事情。你可以把它写得更好:

faculty_id = request.POST.get('faculty_id')
faculty_number = request.POST.get('faculty_number')
first_name = request.POST.get('first_name')
last_name = request.POST.get('last_name')
institute = Institute.objects.create(user=request.user)
Faculty.objects.create(user=user, faculty_id=faculty_id, faculty_number=faculty_number, first_name=first_name, last_name=last_name, institute=institute)

注意:这仍然不是一个非常理想的实现,您直接使用request.POST未清理或验证的值。您应该改用Form[Django docs]ModelForm[Django docs]


推荐阅读