在经理中注释相同项目的数量

时间:2016-08-15 12:25:13

标签: django django-managers django-annotate

我们说我遵循简化模型:

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)的技巧才能获得person姓氏列出的结果;这是无法删除的。

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

我做错了什么?关于如何正确实现这一目标的任何指示,如果没有太多的黑客攻击和而没有针对每张发票点击数据

1 个答案:

答案 0 :(得分:0)

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')