Django视图返回包含额外信息的Queryset

2024-09-29 10:20:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个普通的Django视图,它返回查询集的API。它从URL获取查询参数,并根据参数过滤数据库。它还输出最大长度为3个“零件”对象。在

我想添加一些内容,以便它返回查询集是否被最大长度3截断的信息。其思想是,由于输入了查询参数,如果参数太模糊,那么将有太多的数据从数据库中查询。所以它被剪断了,但是用户需要知道它被剪断了。在

当前代码如下所示

class PartList(generics.ListAPIView):
serializer_class = PartSerializer

def get_queryset(self):
    """
    Optionally restricts the returned purchases to a given user,
    by filtering against a `username` query parameter in the URL.
    """
    queryset = Part.objects.all()

    querydict = self.request.query_params

    for (k, value) in querydict.items():
        search_type = 'contains'
        filter = k + '__' + search_type
        queryset = queryset.filter(**{filter: value})

    query_max_limit = 3
    return queryset[:min(len(queryset), query_max_limit)]

Tags: theinself数据库urlsearch参数value
2条回答

可以将元数据与结果一起传递,如下所示:

{ "is_clipped": true, "results": [ … ] }

Willem's answer是设置is_clipped的好方法。在

但是我认为您对pagination感兴趣,这是一种与客户沟通结果被删减的标准方式。有可能combine your queryset filering with pagination。顺便说一句,我建议您使用django-filter而不是滚动自己的过滤。在

您可以尝试获取四个元素,如果它返回4个,则显示第一个三个元素,并指定数据被剪裁,如下所示:

def get_queryset(self):
    """
    Optionally restricts the returned purchases to a given user,
    by filtering against a `username` query parameter in the URL.
    """
    queryset = Part.objects.all()

    querydict = self.request.query_params

    for (k, value) in querydict.items():
        search_type = 'contains'
        filter = k + '__' + search_type
        queryset = queryset.filter(**{filter: value})

    query_max_limit = 3
    qs = queryset[:query_max_limit+1]
    self.clipped = clipped = len(qs) > query_max_limit
    if clipped:
        return list(qs)[:query_max_limit]
    else:
        return qs

所以这里的get_queryset将返回一个集合(本身不是QuerySet),最多包含三个元素,并且它将设置一个属性self.clipped,该属性指定数据是否被剪裁。在

或者更优雅的方法是先计数,然后切片:

^{pr2}$

最好将这个“剪切”逻辑移到一个专用函数中,如果被剪裁,则返回,而不是设置属性。在

相关问题 更多 >