Как правило, можно переопределить get_context_data, get_queryset и get_object для управления и выполнения других работ (AFAIK) на модельном объекте, здесь «книга». Вопрос в том, как я могу получить любой запрос, сгенерированный после фильтрации, и извлечь полезную информацию из него, чтобы показать в других частях страницы.Выполнение дополнительных операций с окончательным набором запросов модели
Предположим, у меня есть простая модель книги и издателя. Я пытаюсь получить основной запрос и поместить его на объект get_context_data. Но, видимо, get_context получает get_queryset, прежде чем он будет переопределен мной, поэтому мой запрос не является фильтрованным.
# models.py
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Meta:
ordering = ["-name"]
def __unicode__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author')
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
class BookListView(ListView):
context_object_name = "book"
model = Book
def get_queryset(self):
""" filter the publishers based on city """
qs = super(BookListView, self).get_queryset()
city_list = self.request.GET.getlist(u'city', None)
if len(city_list) > 0:
qs = qs.filter(publisher__city__iregex=r'(' + '|'.join(city_list) + ')')
return qs
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(PublisherDetailView, self).get_context_data(**kwargs)
#### How to get the count of the books once filtered in get_queryset
context['book_list'] = self.model.objects.values('publisher_name').annotate(
num_cl=Count('publisher')) \
.order_by("-num_cl")
return context
Отлично! Я закончил использование объекта paginator, так как мне нужно было увидеть общее количество элементов внутри, а не нарезанное. Большое спасибо! –