python - 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})
解决方案
您尝试在创建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] 。
推荐阅读
- laravel - Laravel Eloquent:如何形成“Select distinct with count”请求?
- javascript - 将带有 mtl 的 Blender obj 文件导入到 ThreeJS
- go - 如何使用 gopkg.in/ldap.v3 ldap.NewAddRequest 函数添加多个 objectClass 属性?
- http-headers - 浏览器如何处理“授权:承载”?
- algorithm - 双向边的 HITS 算法
- typescript - vscode中的FontAwesome typescript intellisense
- c++ - 在变量声明中使用for循环
- java - 用泛型重载Java中的方法
- c++ - 如何在双向链表上实现复制分配?
- symfony - 将数据从两个类恢复为多对多