Аннотации, возвращающие чистое значение PK вместо Django HashID
В моем приложении пользователь может принимать одну из 3 различных ролей.
Эти пользователи могут быть назначены на программы, и они могут быть назначены на 3 различных поля, каждое из которых эксклюзивно для роли.
В моем API я пытаюсь запросить всех моих пользователей и аннотировать программы, в которых они участвуют:
Это работает (почти) безупречно и дает мне только 5 совпадений с DB, идеально или нет...
Проблема в том, что я использую поля Django HashID для Program PK, а этот запрос возвращает чистое целочисленное значение для каждой программы.
Я попробовал более "нормальный" подход, получив данные с помощью SerializerMethodField
:
@staticmethod
def get_programs(obj):
role_attr = {
RoleChoices.PROGRAM_MANAGER: 'managed_programs',
RoleChoices.SUPERVISOR: 'supervised_programs',
RoleChoices.CASE_MANAGER: 'case_managed_programs',
}
try:
programs = getattr(obj, role_attr[obj.role], None).values_list('id', 'name')
return [{'id': str(id), 'name': name} for id, name in programs]
except (AttributeError, KeyError):
return []
Это дает нужный мне результат, но количество запросов резко возрастает. Кажется, что он не использует преимущества prefetch_related
, но я не понимаю, как это возможно, учитывая, что я использую один и тот же набор запросов.
Итак, у меня есть два варианта:
- Используйте аннотации, но возвращайте HashID, а не целочисленный PK .
- Пусть SerializerMethodField повторно использует предварительно выбранные данные, вместо повторного запроса
Есть ли способ выполнить любой из этих пунктов?