Как агрегировать вложенные отношения 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
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')