Django Rest Framework 中 prefect_related 的嵌套序列化程序

问题描述 投票:0回答:1

我正在尝试使用

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

我是不是做错了什么?请帮助,谢谢。

python django django-rest-framework django-serializer django-prefetch-related
1个回答
1
投票

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']
© www.soinside.com 2019 - 2024. All rights reserved.