【问题标题】:django rest framework order listview by serializer specific fielddjango rest framework order listview by serializer specific field
【发布时间】:2017-07-20 06:15:25
【问题描述】:

所以我目前有一个使用 django rest 框架构建的 Drink 序列化器。它有一个字段count_need,我使用SerializerMethodField 获得,这不是Drink 模型的一部分。它还有一个 timestamp 字段,它是模型的一部分。如何根据来自/api/drink/?ordering=timestamp 之类的获取请求的参数,通过timestampcount_need 订购ListAPI 视图。目前,我在 ListAPI 视图ordering_fields = ('count_need', 'timestamp', ) 中指定了排序字段,但它似乎没有在任一查询上对 apiview 进行排序。我可以通过timestamp 方法通过get_queryset 订购它,但这不适用于count_need,因为它不是模型的一部分。

【问题讨论】:

    标签: django python-3.x django-rest-framework


    【解决方案1】:

    您可以尝试覆盖视图上的 get_queryset 方法,并在查询集上为 count_need 添加一个带注释的字段。我认为这会更可取,因为它在 SQL 中对于大型列表可能会更快,并且可以与 rest 框架的内置 OrderingFilter 一起使用。

    例子:

    from django.db.models import Count
    
    class MyView(APIView):
        def get_queryset(self):
            qs = self.queryset
            qs = qs.annotate(count_need=Count('need'))
            return qs
    

    推荐阅读:
    https://docs.djangoproject.com/en/1.11/topics/db/aggregation/#aggregations-and-other-queryset-clauses

    另一种选择是在 Python 中实现一些自定义排序,而不是使用 Django ORM。您可以通过覆盖 ListAPI 视图上的 list 方法来做到这一点。

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
    
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            serializer_data = serializer.data
            sorted_serializer_data = sorted(serializer_data, key=lambda x: x['count_need'])
            return self.get_paginated_response(sorted_serializer_data)
    
        serializer = self.get_serializer(queryset, many=True)
        serializer_data = serializer.data
        sorted_serializer_data = sorted(serializer_data, key=lambda x: x['count_need'])
        return Response(sorted_serializer_data)
    

    【讨论】:

    • 哇,你答案的第二部分太棒了,我会在早上实施它,如果它有效,我会评论!谢谢。据我所知,它看起来应该是这样的
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 2021-02-28
    • 2018-10-05
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多