Django - класс модели с непостоянным атрибутом, который должен обновляться при каждом вызове

Мой класс User выглядит следующим образом :

class User(AbstractBaseUser, SafeDeleteModel, PermissionsMixin):
    UNKNOWN = 'Unknown'

    id = models.AutoField(primary_key=True)
    email = models.EmailField(unique=True)
    default_organization = models.ForeignKey(to='Organization', on_delete=models.SET_NULL, null=True,
                                             related_name='default_organization', blank=True)

    organizations = models.ManyToManyField(to='Organization', through='UserOrganizationMembership',
                                           related_name='users', blank=True)

Итак, пользователь может быть частью нескольких организаций. Однако каждый раз, когда он входит в систему, он должен входить через ОДНУ организацию. Теперь у меня есть два вида организаций - внутренняя и клиентская. У меня есть некоторые настройки телеметрии для моего приложения, и идея заключается в том, что я хочу не отправлять телеметрию для внутренних организаций. Я хочу создать атрибут в /users api, который возвращает этот флаг (флаг зависит от пользователя и учетной записи, через которую он входит).

Мой класс представления выглядит следующим образом:

class UsersViewSet(UpdateModelMixin,
                   ListModelMixin,
                   GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserDetailSerializer

    def get_serializer_context(self):
        context = super().get_serializer_context()
        #self.request.user.is_telemetry_enabled =should_send_event(self.request.user, self.request.tenant.is_internal)
        context.update({"request": self.request})

        return context

    def get_permissions(self):
        permission_classes = [IsStaff] if self.action in ('list',) else [CanEditUser]
        return [permission() for permission in permission_classes]

Что я просмотрел :

  1. добавление поля в класс модели и установка его в get_serializer_context. Не работает, потому что добавление поля в модель делает его переменной класса, а не экземпляра. Во-вторых, оно все равно не отображается в ответе /users.
  2. .
  3. устанавливаем это как свойство в models/users.py. Не работает, потому что для установки свойства единственным допустимым аргументом является self, а мой флаг зависит от self, а также от того, через какой аккаунт вошел пользователь. Эта информация присутствует в контексте req для меня.

вы можете добавить вычисляемое поле в класс "UserDetailSerializer", где вы можете вычислить значение из любого места, где вы хотите, например, из сессии.

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