【问题标题】:How to annotate a distinct Count over multiple relationships in Django?如何在 Django 中为多个关系注释不同的计数?
【发布时间】:2017-07-03 09:23:11
【问题描述】:

给定一个与相关模型有多种连接的模型(我将称之为“父”模型),我如何使用通过任一连接链接而不计数的父模型对象的计数来注释查询集重复?

示例模型定义

考虑一个 Article 模型,它有 2 个指向父 Publication 模型的链接,它们的含义非常相似。

from django.db import models

class Publication(models.Model):
    pass

class Article(models.Model):
    publication = models.ForeignKey(Publication, related_name='publications')
    owner = models.ForeignKey(Publication, related_name='owned_articles')

目标

我想提供一个包含出版物列表的页面。业务要求是显示出版物希望获得荣誉的文章数量(这些出版物更喜欢使用慷慨的度量标准进行计数)。如果“所有者”或“出版物”字段指向某篇文章,则该文章被视为组织的一部分,但对于单个出版物,任何文章都不应计入一次以上。如果publication 指向与owner 不同的对象,则一篇文章可能包含在 2 个发布的计数中。

我不想对列表中的每个出版物都执行查询。

这里 Count 注释的问题

Publication.objects.annotate(Count('publications'), Count('owned_articles')) 将是微不足道的。然后我会有count__publicationscount__owned_articles

我的问题是我不知道count__publications 中有多少文章也被计算在count__owned_articles 中。 Django 不允许我将完整的查询集塞进Count,因此在这种需要额外控制计数的一般情况下,需要一种特殊机制。

类似问题

我发现这种情况与这里的问题最相似:

Django annotate count with a distinct field

您可以通过在 InformationUnit 之外添加另一个相关模型并询问两个相关模型中唯一用户名的计数来强化该问题的请求,从而设计出同样的一般情况。

【问题讨论】:

    标签: django annotations django-queryset django-orm


    【解决方案1】:

    (初步答案,用马马虎虎的解决方案回答我自己的问题)

    最好的方法是从 Publication 查询集开始,但是,我可以通过围绕 Article 查询集来设法从 Django ORM 中挤出一个解决方案。

    考虑作为这个问题的解决方案:

    exclusive_owners_qs = Article.objects.exclude(
        publication=F('owner')
    ).annotate(Count('publication')).order_by('publication')
    
    publications_qs = Article.objects.annotate(Count('owner')).order_by('owner')
    

    有了这个,我可以遍历两个查询集并在 python 内部本地将两个数字相加以获得正确的计数。

    这满足要求,但也不是一个优雅的解决方案。消除对 python 循环的需求将是理想的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 2011-04-06
      • 2019-01-13
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      相关资源
      最近更新 更多