Получить данные с помощью аннотации с объединением 3 таблиц - PullRequest
0 голосов
/ 30 октября 2018

У меня есть 3 таблицы: -

    class Organization(models.Model):
       id = models.AutoField(primary_key=True)
       name = models.CharField()
       .....
       #some more field
       .....



    class Billing(models.Model):
         id = models.AutoField(primary_key=True)
         organization = models.ForeignKey(Organization)
         amount = models.IntegerField()
         .....
         #some more field
         ....

.
   class Payment(models.Model):
       id = models.AutoField(primary_key=True)
       billing = models.ForeignKey(Billing)
       organization = models.ForeignKey(Organization)
       paymentDate = models.DateTimeField()
       .....
       #some more field
       ....

Всякий раз, когда платеж производится organization, он каждый раз создает новую запись для таблицы payment и обновляет сумму billing. А есть несколько объектов биллинга, доступны таблицы биллинга. Поэтому я рассчитываю сумму суммы и последний платеж, сделанный для конкретной организации, используя аннотацию.

Я застрял, чтобы найти latest payment date для организации при использовании аннотированного запроса.

billing.objects.filter(
            orgId_id__in = organizationIdList,
            isCancel=0,
            billTime__range=(startDate, endDate)
        ).values('orgId_id').annotate(
            total_amount = Sum('amount'),
            lastest_payment_time = "HERE I AM STUCK",
        )

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 31 октября 2018

Вы можете попробовать это, используя OuterRef и Подзапрос :

 latest_payment = Payment.objects.filter(organization=OuterRef('organization')).order_by("-paymentDate")
 Billing.objects.filter(organization__id__in=organizationIdList).values('organization__id').annotate(total_amount=SUM('amount'), latest_payment=Subquery(latest_payment.values('paymentDate')[:1]))

Для этого решения вам понадобится как минимум Django 1.11 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...