2016-11-18 5 views
0

У меня есть две модели, на которые я хотел бы вернуть сумму. Я получаю ошибку базы данных о подзапросе, возвращающем более одной строки. Какой был бы лучший способ сравнить оба без использования инструкции for?Django Queryset сравнить две разные модели с несколькими строками

AuthorizationT(models.Model) 
    ar_id = models.BigIntegerField(blank=True, null=True) 
    status_flag = models.BigIntegerField(blank=True, null=True) 
BillT(models.Model) 
    paid_id = models.BigIntegerField(blank=True, null=True) 
    recvd = models.FloatField(blank=True, null=True) 

Query Я попытался

paidbill= BillT.objects.values_list('paid_id', flat=true) 
AuthorizationT.objects.values().filter(ar_id=paidbill, status_flag=0).aggregate(Sum('recvd')) 

В SQL я знаю, что это было бы

select sum(recvd) from authorization_t a, bill_t b where a.ar_billid0= b.paid_id and a.status_flag=0 

Я ищу эквивалент в QuerySet

ответ

0

Я думаю, вы не будете быть в состоянии достичь без for loop, потому что я думаю, вам нужно присоединиться к таблицам, так как есть фильтрация на обоих таблицах es, и вы хотите суммировать поле из первой таблицы. Способ объединения таблиц будет prefetch_related() или select_related(), но они используют внешние ключи.

Это приводит меня к предположению, что id fields: bill_id and ar_id следует нормализовать, поскольку похоже, что будет дублирование данных. Использование отношений также упростило бы выполнение запросов.

0

Поскольку paidbill список, вы должны использовать суффикс __in в запросе:

AuthorizationT.objects.filter(ar_id__in=paidbill,status_flag=0).aggregate(Sum('recvd')) 

Если вы смоделировали соотношение моделей (ar_id, paid_id) через ForeignKey или ManyToMany, вы будете в состоянии сделать это тривиально в одном заявлении ORM

+0

Я думаю, что проблема здесь была бы несовместимой, потому что поле является частью модели «BillT». Проблема связана с исходным запросом – Aditya

Смежные вопросы