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

Django DRF:相关序列化程序上的自定义排序,django,django-rest-framework,Django,Django Rest Framework,我有两个连载器,一个是讲师,一个是课程。讲师序列化程序与课程有定义的关系,如下所示: CourseSerializer(many=True,read\u only=True) 如何在讲师序列化程序中指定课程的顺序? 注意:我已经在Course Meta类中定义了排序值,但它是我希望在其他地方使用的默认排序。我想要的是api输出的自定义排序(特别是dept、number、-sement,而不是默认的-sement)。在这种情况下,您应该通过viewset查询集调整排序。我可以想象如下: query

我有两个连载器,一个是讲师,一个是课程。讲师序列化程序与课程有定义的关系,如下所示:

CourseSerializer(many=True,read\u only=True)

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


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

在这种情况下,您应该通过viewset查询集调整排序。我可以想象如下:

queryset=讲师。对象。选择相关(“课程”)。订购人(“课程编号”)

因为它是只读的,所以对该字段使用序列化程序方法不是同样容易吗

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
class InstructorSerializer(serializers.ModelSerializer):
课程=序列化程序。SerializerMethodField()
def get_课程(自我、obj):
有序查询集=
return CourseSerializer(ordered_queryset,many=True,context=self.context)

只需为字段声明提供一个有序的
queryset
参数,就可以做到这一点:

class InstructorSerializer(serializers.ModelSerializer):
courses=CourseSerializer(
queryset=Course.objects.order_by(“…”),
多=真,
只读=真,
)

更多详细信息:

自Django 1.7以来,您可以为相关的
预回迁指定查询集。使用预取只会产生一个额外的数据库查询,而不是使用
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')))

这不就是重新安排教练的顺序吗?我想在讲师序列器中重新安排课程。有一个解决方案(我相信是同一个),它有一个潜在的解决方案。其次还有另一种方法,但是我认为您需要
ModelSerializer
s不接受
queryset
参数。