0

我需要对项目查询集进行排序,引入内容的过时。(内容是与 Item 类相关的多对多)。是否可以通过注释中的 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")
4

1 回答 1

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>]

正如预期的那样。

于 2012-10-15T14:59:13.600 回答