【问题标题】:django rest framework , order_by a JSON from serializers.py filedjango rest 框架,order_by 来自 serializers.py 文件的 JSON
【发布时间】:2014-03-02 21:30:12
【问题描述】:

我正在使用 django rest 框架,我想通过我的 json 进行订购 如何从 serializers.py 文件中使用 django rest 框架创建 order_by 我在 serializers.py 中有这个

class EstablecimientoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Establecimiento
        depth = 1
        fields =   ('nombre','ciudad',)
    order_by = (
        ('nombre',)
    )

我有这个 order_by 但这对 JSON 没有任何作用

在来自 serializers.py 的 JSON 中执行此命令的正确方法是什么?

我在views.py中有

class EstablecimientoViewSet(viewsets.ModelViewSet):
    queryset = Establecimiento.objects.order_by('nombre')
    serializer_class = EstablecimientoSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('categoria','categoria__titulo',)

然后 order_by 不起作用,因为我有这个过滤器, 如何使过滤器与 order_by 一起工作?

【问题讨论】:

    标签: python json django django-rest-framework


    【解决方案1】:

    有一个简单的方法,只需通过添加一个排序行来明确地覆盖它:

    class EstablecimientoViewSet(viewsets.ModelViewSet):
        queryset = Establecimiento.objects
        serializer_class = EstablecimientoSerializer
        filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter)
        ordering = ('nombre',) #add this line
        filter_fields = ('categoria','categoria__titulo',)
    

    【讨论】:

    • 如果您想订购嵌套字段怎么办?
    【解决方案2】:

    您不使用序列化程序进行排序。您需要在视图中使用queryset 属性,如下所示:

    class EstablecimientoListView(generics.ListCreateAPIView):
        queryset = Establecimiento.objects.order_by('nombre')
        serializer_class = EstablecimientoSerializer
    
        def filter_queryset(self, request, queryset, view):
            qs = super(EstablecimientoListView, self).filter_queryset(request, queryset, view)
            qs = qs.order_by('nombre')
            return qs
    

    【讨论】:

    • 这很好,但是因为我在视图上有一个过滤器,所以这个 order_by 不起作用。 class EstablecimientoViewSet(viewsets.ModelViewSet): queryset = Establecimiento.objects.order_by('nombre') serializer_class= EstablecimientoSerializer filter_backends = (filters.DjangoFilterBackend,) filter_fields = ('categoria','categoria__titulo',)
    • @user3236034 我已经更新了我的帖子,似乎是最简单的方法。
    • 非常感谢,但我没有做到我想要的
    猜你喜欢
    • 2014-02-17
    • 1970-01-01
    • 2021-01-30
    • 2014-10-09
    • 2015-01-02
    • 2017-03-19
    • 1970-01-01
    • 2015-10-04
    • 2013-12-26
    相关资源
    最近更新 更多