【问题标题】:DRF: custom ordering on related serializersDRF:相关序列化程序的自定义排序
【发布时间】:2016-01-28 21:11:40
【问题描述】:

我有两个序列化程序,一个用于讲师,一个用于课程。 Instructor 序列化程序与课程具有如下定义的关系:

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

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

注意:我在 Course Meta 类中定义了 ordering 值,但它是我在其他任何地方都想要的默认排序。我想要的是 api 输出的自定义排序(特别是部门、数字、-semester 而不是默认的-semester)。

【问题讨论】:

  • 对此有一个issue(我相信是同一个),它有一个潜在的解决方案。其次还有另一种方式,但我认为你需要another serializer

标签: django django-rest-framework


【解决方案1】:

既然它是只读的,那么对那个字段使用序列化器方法不是很容易吗?

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

【讨论】:

    【解决方案2】:

    从 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')))
    

    【讨论】:

      【解决方案3】:

      在这种情况下,您应该通过视图集查询集调整排序。我会想象以下内容:

      queryset = Instructor.objects.select_related('courses').order_by('courses__number')
      

      【讨论】:

      • 那不只是重新排序讲师吗?我想重新排序 InstructorSerializer 中的课程。
      【解决方案4】:

      这应该可以通过为您的字段声明提供一个有序的queryset 参数来实现:

      class InstructorSerializer(serializers.ModelSerializer):
          courses = CourseSerializer(
              queryset=Course.objects.order_by('...'),
              many=True,
              read_only=True,
          )
      

      更多详情:http://www.django-rest-framework.org/api-guide/relations/#the-queryset-argument

      【讨论】:

      • ModelSerializers 不接受 queryset 参数。
      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多