【发布时间】: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