【问题标题】:Annotate number of identical items in manager在管理器中注释相同项目的数量
【发布时间】:2016-08-15 12:25:12
【问题描述】:

假设我有以下简化模型:

class CurrentInvoices(models.Manager):

    def get_queryset(self):
        qs = super(CurrentInvoices, self).get_queryset()
        current_invoices = qs.order_by('person', '-created_on').distinct('person').values('pk')
        return qs.annotate(invoice_count=models.Count('number')).filter(id__in=current_invoices).order_by('person__last_name')

class Invoice(models.Model):
    created_on = models.DateField()
    person = models.ForeignKey(Person)
    total_amount = models.DecimalField()
    number = models.PositiveSmallIntegerField()

    objects = models.Manager()
    current_invoices = CurrentEDCInvoices()

如果由于某种原因之前生成的发票有误,一个人可以有一个 Invoice 和相同的 number。最新的(最高的created_on)才是最重要的。

需要在管理器中使用.filter(id__in) 的技巧才能得到persons 姓氏列出的结果;无法删除。

现在我想注释number 的总数。 我的尝试annotate(invoice_count=models.Count('number')) 总是返回1,即使有多个。

我做错了什么?关于如何正确实现此目标的任何指示,而无需过多地修改并且不为每张发票打数据库

【问题讨论】:

    标签: django django-managers django-annotate


    【解决方案1】:

    distinct('person') 中似乎有您的问题,它会删除 person 字段的重复项。

    更新

    要完成你的任务,你应该

    current_invoices = qs.order_by('person', '-created_on').distinct('person').values('number')
    return qs.annotate(invoice_count=models.Count('number')).filter(number__in=current_invoices).order_by('person__last_name')
    

    【讨论】:

    • 但是所有相同编号的发票都链接到同一个患者?
    • 如果您需要排除重复发票,您应该区分pk
    • 嗯,我想按人区分,因为我想每人有“一条线”。此外,由于 pk 是唯一的,因此由 pk 区分没有意义?
    • 您的发票有唯一的pk 和重复的number。我对吗?你想计算重复的数字。您对current_invoices 的查询集将返回pks 的每个人的最后一张发票,即每个人只有一张发票。因此,注释查询将仅通过此 pks 并仅返回每个数字的 1 计数。
    • 正确:唯一的pk,重复number。事实上,问题是我只得到一个计数。但是如何解决这个问题?通过删除distinct('person'),问题可能会消失,但我每个人只需要一个结果。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2014-04-25
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多