我有一个普通的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)]
答案 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而不是使用自己的过滤器。