python - 如何使用 Django 的 ORM 进行过滤聚合

标签 python django

我有一个像这样的 Django 模型:

class Post(models.Model):

    name = models.CharField(max_length=10)

class Topic(models.Model):

    name = models.CharField(max_length=10)

class Annotator(models.Model):

    post = models.ForeignKey(Post, related_name='annotations')

    topic = models.ForeignKey(Topic)

    name = models.CharField(max_length=10)

如何找到所有没有与特定 topic 和 Annotator name 值关联的 Annotator 记录的 Post 记录?

如果没有 topicname 过滤条件,Django 查询将如下所示:

qs = Post.objects.all()
qs = qs.annotate(annotations_count=Count('annotations'))
qs = qs.filter(annotations_count=0)

但我想做的是:

qs = Post.objects.all()
qs = qs.annotate(annotations_count=Count('annotations' where name='annotator1' and topic='topic1'))
qs = qs.filter(annotations_count=0)

这显然是不合法的。

我目前正在使用 .raw() 执行传统的 LEFT OUTER JOIN,因此我可以在 WHERE 子句中执行此过滤,但这会阻止我重新使用我使用 Django ORM 重写的大量代码和过滤器。

如何在 Django 的 .annotate() 方法中添加过滤条件,或者以其他方式达到相同的结果?

我正在使用 Django 1.11。

最佳答案

How do I find all Post records that don't have an associated Annotator record with a specific topic and Annotator name value?

如果我理解你的问题,你正在寻找 .exclude() :

Post.objects.exclude(
    annotator__topic='topic1', 
    annotator__name='annotator1'
)

关于python - 如何使用 Django 的 ORM 进行过滤聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44912865/

相关文章:

python - Django 休息框架保存对象问题

python - 在 Django 中实现 REST Web 服务的框架

python - 如何在 django 中使用 celery 运行任务并将结果保存在 django 数据库中?

python - 是否可以让装饰器在 asyncio 执行器中运行阻塞函数?

python - 使用 unstack() reshape pandas 数据框

java - 不同语言中静态代码和有状态代码分离的差异

生产服务器上的 Django 电子邮件超时

django - PermissionError:[Errno 13]尝试使用docker-compose创建项目时,权限被拒绝: '/app/manage.py'

python - 三星不支持 FFmpeg 导出编解码器

python - 如何使用 Orange 离散化存储在 numpy 数组中的数据?