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]
Что я просмотрел :
- добавление поля в класс модели и установка его в
get_serializer_context
. Не работает, потому что добавление поля в модель делает его переменной класса, а не экземпляра. Во-вторых, оно все равно не отображается в ответе /users. .
- устанавливаем это как свойство в models/users.py. Не работает, потому что для установки свойства единственным допустимым аргументом является
self
, а мой флаг зависит отself
, а также от того, через какой аккаунт вошел пользователь. Эта информация присутствует в контексте req для меня.
вы можете добавить вычисляемое поле в класс "UserDetailSerializer", где вы можете вычислить значение из любого места, где вы хотите, например, из сессии.