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
字段为只读的信息,因为它包含在我的字段中,我希望它在那里。谢谢,凯尔,没有你的帮助我是不可能弄明白的!