我有一个普通的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)]
可以将元数据与结果一起传递,如下所示:
{ "is_clipped": true, "results": [ … ] }
Willem's answer是设置
is_clipped
的好方法。在但是我认为您对pagination感兴趣,这是一种与客户沟通结果被删减的标准方式。有可能combine your queryset filering with pagination。顺便说一句,我建议您使用django-filter而不是滚动自己的过滤。在
您可以尝试获取四个元素,如果它返回4个,则显示第一个三个元素,并指定数据被剪裁,如下所示:
所以这里的
get_queryset
将返回一个集合(本身不是QuerySet
),最多包含三个元素,并且它将设置一个属性self.clipped
,该属性指定数据是否被剪裁。在或者更优雅的方法是先计数,然后切片:
^{pr2}$最好将这个“剪切”逻辑移到一个专用函数中,如果被剪裁,则返回,而不是设置属性。在
相关问题 更多 >
编程相关推荐