0

假设我有以下简化模型:

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

如果由于某种原因先前生成的发票是错误的,则Person 可以拥有Invoice相同的值。number最新的(最高created_on的)是最重要的。

要获得按姓氏.filter(id__in)列出的结果,需要使用管理器中的技巧;person这不能被删除。

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

我究竟做错了什么?关于如何正确实现这一点的任何指示,而不会过多地破解并且不会为每张发票打到数据库?

4

1 回答 1

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')
于 2016-08-15T12:30:17.440 回答