Как агрегировать вложенные отношения manytomany в django orm

Учитывая псевдоопределения:

class User:
    name: string
    
class Account:
    owner: foreignkey(User, related_name="accounts")

class Transactions:
    type: Enum(1,2,3)
    account: foreignkey(Account, related_name="transactions"
    value: Int

Как написать этот запрос, используя django ORM?

SELECT user.id, type, AVG(value) as type_average
FROM user
JOIN account ON account.owner = user.id
JOIN transactions ON transactions.account = account.id
GROUP BY user.id, type

Вы .annotate(…) [Django-doc]:

from django.db.models import Avg, F

User.objects.values(
    user_id=F('pk'), type=F('accounts__transactions__type')
).annotate(type_average=Avg('accounts__transactions__value')).order_by(
    'user_id', 'type'
)

Вы можете создать представление в вашей базе данных для этого запроса и затем сопоставить с ним модель Django, или попробовать использовать ORM следующим образом:

from django.db.models import Avg, F

result = User.objects.annotate(type=F('account__transactions__type'),
type_average=Avg('account__transactions__value')).values('id', 'type', 'type_average')
Вернуться на верх