带有附加信息的Django View Return Queryset

时间:2018-10-10 12:29:36

标签: python django django-rest-framework django-views

我有一个普通的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)]

2 个答案:

答案 0 :(得分:0)

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

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),该集合最多包含 三个元素,并将设置属性{{1} },用于指定数据是否被裁剪。

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

self.clipped

最好将此“剪切”逻辑移至专用函数,如果已剪切则返回而不是设置属性。

答案 1 :(得分:0)

将元数据和结果一起传递是非常好的,就像这样:

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

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

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