2016-08-15 5 views
0

Скажут, у меня есть следующий упрощенная модель: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 за каждый счет-фактуру?

ответ

0

У вас возникли проблемы с distinct('person'), которые удаляют дубликаты на person.

Update

Чтобы завершить задачу, вы должны

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

Но все счета-фактуры с одинаковым номером связаны с тем же пациентом? – SaeX

+0

Если вам нужно исключить дубликаты счетов, вы должны отличить 'pk' – atn

+0

Хм, я хочу отличить от человека, так как хочу иметь« одну строку »на человека. Кроме того, отличная от pk не имеет смысла, поскольку pk уникальна? – SaeX