Obtener usuario actual en Serializador de modelos

¿Es posible obtener el usuario actual en un modelo de serializador? Me gustaría hacerlo sin tener que separarme de los generics, ya que es una tarea simple que debe hacerse.

Mi modelo:

class Activity(models.Model): number = models.PositiveIntegerField( blank=True, null=True, help_text="Activity number. For record keeping only.") instructions = models.TextField() difficulty = models.ForeignKey(Difficulty) categories = models.ManyToManyField(Category) boosters = models.ManyToManyField(Booster) class Meta(): verbose_name_plural = "Activities" 

Mi serializador:

 class ActivitySerializer(serializers.ModelSerializer): class Meta: model = Activity 

Y mi opinión:

 class ActivityDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Activity.objects.all() serializer_class = ActivityDetailSerializer 

¿Cómo puedo obtener el modelo devuelto, con un user campo adicional para que mi respuesta tenga este aspecto:

 { "id": 1, "difficulty": 1, "categories": [ 1 ], "boosters": [ 1 ], "current_user": 1 //Current authenticated user here } 

Encontré la respuesta mirando a través del código fuente de DRF.

 class ActivitySerializer(serializers.ModelSerializer): # Create a custom method field current_user = serializers.SerializerMethodField('_user') # Use this method for the custom field def _user(self, obj): request = getattr(self.context, 'request', None) if request: return request.user class Meta: model = Activity # Add our custom method to the fields of the serializer fields = ('id','current_user') 

La clave es el hecho de que los métodos definidos dentro de un ModelSerializer tienen acceso a su propio contexto, que siempre incluye la solicitud (que contiene un usuario cuando se autentica uno). Como mis permisos son solo para usuarios autenticados, siempre debe haber algo aquí.

Esto también se puede hacer en otros serializadores djangorestframework incorporados.

Como señaló Braden Holt, si su user todavía está vacío (es decir, _user está devolviendo None ), puede deberse a que el serializador no se inicializó con la solicitud como parte del contexto. Para solucionar este problema, simplemente agregue el contexto de solicitud al inicializar el serializador:

 serializer = ActivitySerializer( data=request.data, context={ 'request': request } ) 

Se pasa un contexto al serializador en el marco de REST, que contiene la solicitud de forma predeterminada. Así que solo puedes usar self.context['request'].user dentro de tu serializador.

He modificado el request.data:

 serializer = SectionSerializer(data=add_profile_data(request.data, request.user)) def add_profile_data(data, user): data['user'] = user.profile.id return data