Аннотации, возвращающие чистое значение 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 повторно использует предварительно выбранные данные, вместо повторного запроса

Есть ли способ выполнить любой из этих пунктов?

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