在Django的ORM中过滤注释或计数

时间:2015-02-18 10:42:51

标签: django orm

我正在尝试查找所有至少有2个已发布条目的博客。

from django.db import models as Count, db_models

class Blog(db_models.Model):
    name = models.CharField(max_length=100)

class Entry(db_models.Model):
    blog = models.ForeignKey(Blog)
    is_published = models.BooleanField()

我可以找到所有使用至少两个条目的博客。

Blog.objects.annotate(entries=Count('entry')).filter(entries__gte=2)

但是如何从计数中排除所有未发布的条目?

2 个答案:

答案 0 :(得分:1)

您可以尝试这样:

Blog.objects.exclude(entry__is_published=False).annotate(entries=Count('entry')).filter(entries__gte=2)

答案 1 :(得分:0)

@ruddra 回答很不错,但这样您也会排除包含单个未发布条目和两个以上已发布条目的博客。不幸的是,我能想到的最好的解决方案是使用django的.extra

Blog.objects.extra(
    #the select is optional
    #if u need the blog's published entry count
    select={
        'published_entry_count': "select count(*) from `entry` where `is_published` = 1 and `entry`.`blog_id` = `blog`.`id`"
    },
    where=["(select count(*) from `entry` where `is_published` = 1 and `entry`.`blog_id` = `blog`.`id`) >= 2"]
)