简体   繁体   English

django:外键约束失败

[英]django: FOREIGN KEY constraint failed

In my django project when I'm trying to add a faculty it throws a "FOREIGN KEY constraint failed" error.在我的 django 项目中,当我尝试添加教员时,它会引发“外键约束失败”错误。 Here I'm trying to save the faculty under the institute and all the roles have a user login which is linked with a one to one field models.py:在这里,我试图保存学院下的教职员工,并且所有角色都有一个用户登录名,该登录名与一对一字段 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 add faculty function: views.py 添加教师 function:

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})

You try to specify the institute like so while creating the Faculty instance:您尝试在创建Faculty实例时像这样指定学院:

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

This does not work because the instance you provide is not saved to the database it is just created in python.这不起作用,因为您提供的实例没有保存到它刚刚在 python 中创建的数据库中。 In fact this style of writing code can be said to be somewhat bad as that one line of code is doing multiple things at the same time.事实上,这种写代码的方式可以说是有些糟糕,因为一行代码同时做多件事情。 You can write it better as:你可以把它写得更好:

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)

Note: This is still not a very ideal implementation, you are directly using values from request.POST which are not cleaned or validated.注意:这仍然不是一个非常理想的实现,您直接使用request.POST中未清理或验证的值。 You should use a Form [Django docs] or a ModelForm [Django docs] instead.您应该改用Form [Django docs]ModelForm [Django docs]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM