首页 > 解决方案 > 无法将数据保存到 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')]}

标签: pythondjangodjango-rest-frameworkdjango-serializer

解决方案


  1. 您遇到的错误可能是因为您的模型元数据中的唯一性,我尝试使用您的代码并在课程和学生的注册已经存在时遇到了同样的错误。删除了用户的注册并且它起作用了。

因此,您正在尝试使用相同的用户和课程保存注册,这就是您收到此错误的原因。

  1. 您正在验证序列化程序

请求数据

确保您在其中提供数据,然后在保存数据时设置学生和课程。在serializer.save()之前,您的序列化程序无效,因为 request.data 中没有数据或无效数据。我已经通过在 POST 方法中提供课程和学生来检查它,它工作正常。

建议:发布课程,要求学生,因为它们是必填字段,只需简单地执行 request.save()。


推荐阅读