Вы можете попытаться получить четыре элемента, и, если он вернет четыре, вы отобразите first three и укажите, что данные обрезаются, например:
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
, который определяет, будет лиданные были обрезаны.
Или более элегантный подход - сначала сосчитать, а затем срезать:
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 = qs.count() > query_max_limit
if clipped:
return queryset[:query_max_limit]
else:
return qs
Возможно, было бы лучше переместить эту логику «отсечения» в выделенную функцию,и вернуть, если оно обрезано, вместо установки атрибута.