Django:使用特定的筛选字段对Queryset进行排序

时间:2012-10-15 14:05:27

标签: django sorting django-queryset annotate

我需要对项目查询集进行排序,引入内容的过时。 (内容是与Item类相关的ManytoMany)。 是否可以在注释中按pub_date过滤内容?

我的代码适用于每个内容发布日期。我需要使用annotate函数来处理“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")

1 个答案:

答案 0 :(得分:0)

你可以过滤然后注释。

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个内容和两个项目。 ID为1的项目通过内容多对多与内容ID为1。 ID为2的项目与内容ID为2和3的关系通过内容多对多。

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

正如所料。