Вложенные подзапросы в Django работают очень медленно

Я работаю над проектом, в котором пользователи могут иметь один профиль, каждый профиль может иметь много счетов, а счет может иметь много платежей. Важными частями моделей являются следующие:

class Profile(models.Model):
    username = models.CharField(max_length=250)
    account = models.ForeignKey(Account)

class Account(models.Model):
    payment = models.ForeignKey(Payment)

class Payment(models.Model):
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    account_id = models.CharField() # An unique id for the account the payment belongs
  

Мне нужно создать аннотацию в модели Profile с суммой всех платежей от этого пользователя, чтобы затем манипулировать этими данными с помощью pandas. Мне удалось создать QuerySet с использованием вложенных подзапросов, но эта операция выполняется крайне медленно (медленнее, чем итерации по всем профилям для вычисления этого значения)

Вот как я это сделал:

payment_groups = Payment.objects.filter(account_id=OuterRef("pk")).order_by().values("account_id")

payments_total = Subquery(payment_groups.annotate(total=Sum("amount")).values("total"), output_field=models.DecimalField())

account_groups = Account.objects.filter(profile=OuterRef("pk")).order_by().values("profile")

accounts_total = Subquery(account_groups.annotate(total=Sum(paymments_total)).values("total"), output_field=models.DecimalField())

profiles = Profile.objects.all().annotate(account_total=acount_total)

Что в этом коде делает подзапросы такими медленными? Я уже делал подобные подзапросы раньше, чтобы получить сумму полей в дочерней модели. Я знаю, что сделать это во внучатой модели сложнее и требует больше времени, но это не должно быть настолько медленным.

Есть ли способ повысить эффективность этой операции?

Вернуться на верх