我正在尝试使用
prefect_related
制作嵌套序列化器,但它不起作用,这是我的代码:
模型.py
from django.db import models
class Student(models.Model):
phone = models.IntegerField(null=True)
birth_date = models.DateField(null=True)
user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, related_name="student")
class Course(models.Model):
title = models.CharField(max_length=100, blank=True, default='')
class CourseEnroll(models.Model):
course = models.ForeignKey(Course, on_delete=models.PROTECT, related_name='course_enroll')
student = models.ForeignKey(Student, on_delete=models.PROTECT, related_name='student_enroll')
views.py
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from quiz.models import Course
from quiz.serializers import CourseSerializer
class CourseViewSet(mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
GenericViewSet):
def get_queryset(self):
queryset = Course.objects.prefetch_related("course_enroll").all()
return queryset
serializer_class = CourseSerializer
序列化程序.py
from rest_framework import serializers
from quiz.models import Course, CourseEnroll
class CourseEnrollSerializer(serializers.ModelSerializer):
class Meta:
model = CourseEnroll
fields = ['id']
class CourseSerializer(serializers.ModelSerializer):
student_enrolled = CourseEnrollSerializer(many=True, read_only=True)
class Meta:
model = Course
fields = ['id', 'title', 'student_enrolled']
这是我的回购协议: https://github.com/congson95dev/regov-pop-quiz-backend-s-v1
我是不是做错了什么?请帮助,谢谢。
prefetch_related
不会创建嵌套序列化。相反,它用于缓存相关的模型字段,以便在执行查询集时,它不会进行额外的数据库调用。
在这里,您使用
student_entrolled
指向CourseEnrollSerializer
,由于字段名称错误,这将不起作用。应该是:
class CourseSerializer(serializers.ModelSerializer):
course_enroll = CourseEnrollSerializer(many=True, read_only=True)
class Meta:
model = Course
fields = ['id', 'title', 'course_enroll']