update tutorial serializermethodfield queryset framework example errors python django serialization django-rest-framework

python - tutorial - serializer errors django



Obtener usuario actual en Model Serializer (2)

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). Dado que mis permisos son solo para usuarios autenticados, siempre debe haber algo aquí.

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

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

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

¿Es posible obtener el usuario actual en un serializador modelo? Me gustaría hacerlo sin tener que alejarme de los genéricos, 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 punto de vista:

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 se vea así:

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


Se pasa un contexto al serializador en el marco REST, que contiene la solicitud por defecto. Así que puede usar el self.context[''request''].user Dentro de su serializador.