Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework 序列化程序的更新方法仅创建和不创建';t更新(Django rest框架)_Django Rest Framework - Fatal编程技术网

Django rest framework 序列化程序的更新方法仅创建和不创建';t更新(Django rest框架)

Django rest framework 序列化程序的更新方法仅创建和不创建';t更新(Django rest框架),django-rest-framework,Django Rest Framework,我很难使用嵌套序列化程序,尤其是更新它们。到目前为止,我可以更新课程描述和嵌套序列化程序之前的所有主要字段(如课程描述、标题等)。理想情况下,我希望使用lesson\u id、而不是lesson.title进行搜索,就像现在一样,同时更新描述和标题。有解决办法吗 My型号.py class Course (models.Model): title = models.CharField (max_length=150) description = models.CharField(

我很难使用嵌套序列化程序,尤其是更新它们。到目前为止,我可以更新课程描述和嵌套序列化程序之前的所有主要字段(如课程描述、标题等)。理想情况下,我希望使用
lesson\u id、
而不是
lesson.title进行搜索,就像现在一样,同时更新描述和标题。有解决办法吗

My型号.py

class Course (models.Model):
    title = models.CharField (max_length=150)
    description = models.CharField(max_length=250, default="No Description")
    student = models.ManyToManyField(Student, related_name='courses', blank=True)
    teacher = models.ManyToManyField(Teacher, related_name='teacher', blank=True)

    def __str__(self):
        return self.title

class Lesson (models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField(default="No Description")
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='lessons')

    def __str__(self):
        return self.title
Serializers.py问题出在哪里

class CourseSerializer (serializers.ModelSerializer):

    lessons = LessonSerializer(many=True, required=False)
    #teacher = TeacherSerializer(many=True)


    class Meta:
        model = Course
        fields = ('id', 'title', 'description', 'lessons')  #to separate serializer with students for teachers later

    def update(self, instance, validated_data):
        lessons = validated_data.pop('lessons', [])
        instance = super().update(instance, validated_data)
        for lesson in lessons:
            lesson, updated = Lesson.objects.update_or_create( defaults={'description': lesson["description"]},  title= lesson["title"]) 
            #pk = instance.lessons_id doesn't work, I cannot get this id
            instance.save()
        return instance
视图

class CourseDetailDeleteView (generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (IsAdminUserOrAuthenticatedOrReadOnly,)
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

    def update(self, request, *args, **kwargs):
        serializer = CourseSerializer(instance=self.get_object(), data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()

        return Response(serializer.data)

如果您的问题是
验证的_数据[“课程”][0][“id”]
不存在:

默认情况下,
ModelSerializer
id
字段是只读的,因此
id
不包括在
.create()或.update()
中的
validated\u数据中。因此,您必须覆盖以下内容:

class LessonSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
    ....

    ## Optional: in case you don't want `id` getting explicitly set
    def create(self, validated_data):
        validated_data.pop("id", None)
        return super().create(self, validated_data)

    ## Optional: in case you don't want `id` of the instance getting updated
    def update(self, instance, validated_data):
        validated_data.pop("id", None)
        return super().update(self, instance, validated_data)


另一项说明:
无法知道是否在
CoursedDetailDeleteView.update
中调用了
serializer.save()
。我建议改为设置
serializer.is\u valid(raise\u exception=True)
,这样它就可以返回错误消息并向您显示它为什么没有保存。

Wow!我在
ModelSerializer
中没有找到
id
字段为只读的信息,因为它包含在我的
字段中,我希望它在那里。谢谢,凯尔,没有你的帮助我是不可能弄明白的!