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.