Скажут, у меня есть следующий упрощенная модель: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
s фамилия; это невозможно удалить.
Я хотел бы аннотировать общее кол-во number
. Моя попытка annotate(invoice_count=models.Count('number'))
всегда возвращает 1
, хотя есть несколько.
Что я делаю неправильно? Любые указатели на то, как правильно достичь этого, не взломав слишком много и , не нажимая DB за каждый счет-фактуру?
Но все счета-фактуры с одинаковым номером связаны с тем же пациентом? – SaeX
Если вам нужно исключить дубликаты счетов, вы должны отличить 'pk' – atn
Хм, я хочу отличить от человека, так как хочу иметь« одну строку »на человека. Кроме того, отличная от pk не имеет смысла, поскольку pk уникальна? – SaeX