Django: заказ набора запросов с определенным отфильтрованным полем

Мне нужно отсортировать набор запросов элементов, введя устаревание контента. (Контент ManytoMany связан с классом Item). Можно ли фильтровать содержимое по pub_date в аннотации?

Мой код работает здесь для каждой даты публикации контента. Мне нужно, чтобы функция аннотации работала для "pub_date > '2012-10-10'" (например).

self.queryset = Item.objects.all()    
self.queryset = self.queryset.annotate(
                Count("content")).order_by("-content__count")

Я попытался отфильтровать с помощью функции extra(), которая не работает:

self.queryset = self.queryset.extra(select={
'content': "pub_date > '2012-10-10'"}).annotate(
Count("content")).order_by("-content__count")

person guillaumekal    schedule 15.10.2012    source источник


Ответы (1)


Вы можете просто отфильтровать, а затем аннотировать.

self.queryset = Items.objetct.filter(content__pub_date__gt = '2012-10-10')
self.queryset = self.queryset.annotate(
    Count("content")).order_by("-content__count")

Допустим, ваши модели выглядят так

class Content(models.Model):
    pub_date = models.DateTimeField()

    def __unicode__(self):
        return "%s" % self.id

class Item(models.Model):
    content = models.ManyToManyField(Content)

    def __unicode__(self):
        return "%s" % self.id

В моем тесте я добавил 3 содержимого и два элемента. Элемент с идентификатором 1 имеет отношение к содержимому с идентификатором 1 через содержимое многие ко многим. Элемент с идентификатором 2 имеет отношение к содержимому с идентификаторами 2 и 3 через содержимое многие ко многим.

>>> Item.objects.filter(
        content__pub_date__gt ='2012-10-10').annotate(
        Count("content")).order_by("-content__count")
>>> [<Item: 2>, <Item: 1>]

Как и ожидалось.

person esauro    schedule 15.10.2012
comment
Хорошо, но моя проблема немного в другом. Я хотел бы отфильтровать контент по pub_date, а затем отсортировать элементы по content__count - person guillaumekal; 15.10.2012
comment
Извините, но я не понимаю, что вы имеете в виду. С моим кодом вы фильтруете по pub_date, а затем упорядочиваете по content__count. Я что-то упускаю? - person esauro; 15.10.2012
comment
Content и Item — это два разных класса с отношением ManytoMany. Так что они фильтруют по-разному. - person guillaumekal; 15.10.2012
comment
@guillaumekal Я редактирую исходный ответ, чтобы показать вам, как это работает. Я думаю, это правильно. - person esauro; 15.10.2012