2016-10-09 3 views
1

У меня есть следующий запрос в Postgres:Преобразование SQL QUERY в Django

SELECT a.id, a.name, a.code, 
(SELECT coalesce((SELECT MAX(value) FROM financials WHERE client_key=a.id AND year=2016), 0) AS ca_vlr_n) 
FROM clients a 

Я хочу, чтобы перевести его в Django, но я не знаю, как справиться с этой Coalesce. Я сделал это:

queryset = Client.objects.values('name', 'code').annotate(ca_vlr_n=Coalesce(Max('financial__value'), V(0))) 

Но я не знаю, как поставить условие на год.

Моя модель:

class Client(models.Model): 
    name    = models.CharField(help_text="Client's Name", max_length=128, unique=True) 
    code    = models.CharField(help_text="Client's CUI", max_length=50) 

class Financial(models.Model): 
    year    = models.PositiveSmallIntegerField() 
    client    = models.ForeignKey(Client, on_delete=models.CASCADE) 
    value    = models.BigIntegerField() 

ответ

0

Попробуйте заменить Coalesce с Case

queryset = Client.objects.filter(financial__year=2016,).values('name', 'code').annotate(
    ca_vlr_n=Case(
     When(financial__year=2016, then=Max('financial__value')), 
     output_field=BigIntegerField(), default=V(0) 
    ) 
) 
+0

Спасибо, но это не нормально. Он возвращает мне больше, чем мне нужно. Он возвращает мне все финансовые годы для всех моих клиентов. – tatulea

+0

@tatulea Попробуйте добавить фильтр. См. Обновленный ответ –

+0

Это исключение: django.core.exceptions.FieldError: не удается разрешить ключевое слово «financial_set» в поле. – tatulea