DRF:相关序列化程序的自定义排序

cha*_*dgh 9 django django-rest-framework

我有两个序列化程序,一个用于讲师,一个用于课程.教师序列化程序与课程有明确的关系,如下所示:

courses = CourseSerializer(many=True, read_only=True)

如何在讲师序列化程序中指定课程的顺序?

注意:我已经ordering在Course Meta类中定义了值,但它是我想要的其他地方的默认排序.我想要的是api输出的自定义排序(特别是dept,number,-semester而不是默认的-semester).

小智 16

由于它是只读的,对于那个字段使用序列化方法是不是很容易?

class InstructorSerializer(serializers.ModelSerializer):
    courses = serializers.SerializerMethodField()

    def get_courses(self, obj):
         ordered_queryset = <do your magic here>
         return CourseSerializer(ordered_queryset, many=True, context=self.context).data
Run Code Online (Sandbox Code Playgroud)


End*_*oth 11

从 Django 1.7 开始,您可以为prefetch_related. 使用预取只会产生一个额外的数据库查询,而不是每个带有SerializerMethodField.

from rest_framework import viewsets
from django.db.models import Prefetch

class InstructorViewSet(viewsets.ModelViewSet):
    queryset = Instructor.objects.prefetch_related(Prefetch(
        'courses',
        queryset=Course.objects.order_by('dept', 'number')))
Run Code Online (Sandbox Code Playgroud)