【问题标题】:Getting random object of a model with django-rest-framework after applying filters应用过滤器后使用 django-rest-framework 获取模型的随机对象
【发布时间】:2021-07-12 20:43:42
【问题描述】:

所以基于这个 Stack Overflow 问题:

Getting random object of a model with django-rest-framework

我正试图弄清楚如何做到这一点,但应用过滤器后端之后。

我有这个类和这些方法

class DictionaryRandomView(generics.ListAPIView):
    def get_queryset(self):
      return Dictionary.objects.all()

    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)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

还有几个过滤器后端(如果需要,可以包括)。

问题是我需要在查询之前应用过滤器后端。

我应该在 list 方法还是 get_queryset 方法中执行此操作?

例如,我有与字典相关的级别(用于学习语言)。

我想将我的查询限制为只有级别 6 的单词,然后在该集合中获取随机值(我可以作为过滤器传递的动态数字)。

所以我想要做的伪代码是这样的:

get_random_value("SELECT * FROM dictionary WHERE level = 6")

如何在 DRF listAPIView 中做到这一点?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我认为最简单的方法是在 get_queryset 方法中按级别过滤,然后使用过滤器后端应用其他过滤器。

    对于排序部分,如果您需要对结果进行随机排序,您可以使用queryset.order_by('?'),但要小心,因为它可能会占用大量资源。

    此外,我还建议保持您的响应对象一致(即始终为此端点发送分页响应),这样您就不必在前端处理不同的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2019-07-11
      相关资源
      最近更新 更多