Есть ли способ динамически аннотировать значение из 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 жестко закодирован.

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