2014-11-11 2 views
0

Как правило, можно переопределить 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 

ответ

2

Почему вы не используете запрос непосредственно?

context['book_list'] = context['object_list'].annotate(...) 

Также обратите внимание, что ваш фильтр запроса очень странный. Лучше использовать __in:

if city_list: 
    qs = qs.filter(publisher__city__in=[city_list]) 
+0

Отлично! Я закончил использование объекта paginator, так как мне нужно было увидеть общее количество элементов внутри, а не нарезанное. Большое спасибо! –

Смежные вопросы