python - 无法将数据保存到 Django Rest Framework 中的外键字段中
问题描述
我正在做一个项目,我必须让学生参加一门课程。我有一个名为 Enrollment 的模型,其中包含 Course 和 Student 的两个外键字段。当他们提交时,我正在尝试将课程和学生保存在注册模型中。但是在调用 save 方法后,响应也会返回响应,因为课程和学生是必需的。
我的模型
class Course(models.Model):
course_name = models.CharField(max_length=300,default=None)
author = models.ForeignKey(TeacherProfile,on_delete=models.CASCADE,null=True,default=None)
course_description = models.TextField(null=True)
course_cover = models.ImageField(null=True,blank=True,upload_to='course_covers/')
def __str__(self):
return self.course_name```
class Enrollment(models.Model):
enroll_key = models.CharField(max_length=100,default="Text here",null=True)
course = models.ForeignKey(Course,on_delete=models.CASCADE,null=True)
student = models.ForeignKey(StudentProfile,on_delete=models.CASCADE,null=True)
def __str__(self):
return self.course.course_name
class Meta:
unique_together = [['course','student']]
串行器
class CourseEnrollSerializer(serializers.ModelSerializer):
class Meta:
model = Enrollment
fields = ['enroll_key','course','student']
我的看法
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def EnrollCourse(request,pk):
course = Course.objects.get(id=pk)
print("course",course)
student = StudentProfile.objects.get(user=request.user)
print("student",student)
serializer = CourseEnrollSerializer(data=request.data)
print(serializer)
print("loading the serializer...")
if serializer.is_valid():
serializer.save(course=course,student=student)
else:
print("Serializer not valid",serializer.errors)
return Response(serializer.errors)
urls.py
path('enrollcourse/<int:pk>/',views.EnrollCourse,name='enroll_course'),
#pk is course primarykey
What I get after printing serializer.errors
{'course': [ErrorDetail(string='This field is required.', code='required')], 'student': [ErrorDetail(string='This field is required.', code='required')]}
解决方案
- 您遇到的错误可能是因为您的模型元数据中的唯一性,我尝试使用您的代码并在课程和学生的注册已经存在时遇到了同样的错误。删除了用户的注册并且它起作用了。
因此,您正在尝试使用相同的用户和课程保存注册,这就是您收到此错误的原因。
- 您正在验证序列化程序
请求数据
确保您在其中提供数据,然后在保存数据时设置学生和课程。在serializer.save()之前,您的序列化程序无效,因为 request.data 中没有数据或无效数据。我已经通过在 POST 方法中提供课程和学生来检查它,它工作正常。
建议:发布课程,要求学生,因为它们是必填字段,只需简单地执行 request.save()。
推荐阅读
- typescript - 如何通过考虑 Typescript 中字符串数组中元素的名称来删除元素
- php - php - mysqli - 如果不存在则创建数据库
- c# - 在将 Azure Key Vault 配置提供程序用于机密/配置时使用 IConfiguration 方法,例如 Bind 和 GetConnectionString
- javascript - 如何转换这两个数据结构?
- java - 为什么我们在登录过程中使用异步,即使我们必须等待结果?
- python - 使用 SQLAlchemy 迁移数据库(sqlite 到 Postgres CloudSQL)
- javascript - 为 HTML DOM 创建元素
- ios - 反应本机 - 相机胶卷返回的 uri 没有文件的扩展名
- android - 在解决构建路径错误之前无法构建 Flutter
- vb.net - 将文本写入 .txt 文件的通用代码?