【发布时间】: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__publications 和count__owned_articles。
我的问题是我不知道count__publications 中有多少文章也被计算在count__owned_articles 中。 Django 不允许我将完整的查询集塞进Count,因此在这种需要额外控制计数的一般情况下,需要一种特殊机制。
类似问题
我发现这种情况与这里的问题最相似:
Django annotate count with a distinct field
您可以通过在 InformationUnit 之外添加另一个相关模型并询问两个相关模型中唯一用户名的计数来强化该问题的请求,从而设计出同样的一般情况。
【问题讨论】:
标签: django annotations django-queryset django-orm