Есть ли способ динамически аннотировать значение из JSONField с помощью другой аннотации в Django?
У меня есть следующая аннотация:
member_qs = RoomMember.objects.filter(room_id=OuterRef('id'), ...)
qs = Room.objects.annotate(
person_role=Case(
When(Exists(member_qs), then=Subquery(member_qs.values_list('role', flat=True))),
default=Value(request.user.global_role)
),
person_permissions=Case(
When(Q(person_role='creator'), then=F('role_permissions__creator')),
When(Q(person_role='moderator'), then=F('role_permissions__moderator')),
When(Q(person_role='member'), then=F('role_permissions__member')),
When(Q(person_role='authenticated'), then=F('role_permissions__authenticated')),
default=F('role_permissions__anonymous')
),
can_chat=F('person_permissions__chat_send'),
can_add_videos=F('person_permissions__queue_extend'),
)
..., где role_permissions
- это JSONField в данной форме: {"role_name": {"permission_name": true|false}}
Это работает, но приводит к уродливому и очень медленному SQL. Я хочу упростить аннотацию person_permissions
или полностью избавиться от нее, но я не могу использовать person_role
напрямую, потому что F
жестко закодирован.