我需要对项目查询集进行排序,引入内容的过时。 (内容是与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")
答案 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>]
正如所料。