Вложенные подзапросы в 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)
Что в этом коде делает подзапросы такими медленными? Я уже делал подобные подзапросы раньше, чтобы получить сумму полей в дочерней модели. Я знаю, что сделать это во внучатой модели сложнее и требует больше времени, но это не должно быть настолько медленным.
Есть ли способ повысить эффективность этой операции?