update - serializer create django
Pase el contexto de solicitud al serializador desde Viewset en Django Rest Framework (4)
Tengo un caso donde los valores para un campo de serializador dependen de la identidad del usuario actualmente conectado. He visto cómo agregar al usuario al contexto al inicializar un serializador, pero no estoy seguro de cómo hacerlo al usar un ViewSet, ya que solo proporciona la clase de serializador y no la instancia del serializador real.
Básicamente me gustaría saber cómo ir desde:
class myModelViewSet(ModelViewSet):
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer
a:
class myModelSerializer(serializers.ModelSerializer):
uploaded_by = serializers.SerializerMethodField()
special_field = serializers.SerializerMethodField()
class Meta:
model = myModel
def get_special_field(self, obj):
if self.context[''request''].user.has_perm(''something.add_something''):
return something
Lo siento si no estaba claro, de los DOC: Agregar contexto adicional que dice hacer
serializer = AccountSerializer(account, context={''request'': request})
serializer.data
Pero no estoy seguro de cómo hacerlo automáticamente desde el conjunto de vistas, ya que solo puedo cambiar la clase de serializador, y no la instancia del serializador en sí.
los valores para un campo de serializador dependen de la identidad del usuario actualmente conectado
Así es como manejo estos casos en mi ModelViewSet:
def perform_create(self, serializer):
user = self.request.user
if user.username == ''myuser'':
serializer.data[''myfield''] = ''something''
serializer.save()
El contexto primario de retorno en la función
get_serializer_context
facilitará el acceso a la solicitud y sus datos.
class myModelViewSet(ModelViewSet):
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer
def get_serializer_context(self):
"""
pass request attribute to serializer
"""
context = super(myModelViewSet, self).get_serializer_context()
return context
Esto es muy estable ya que cada vez que solicitamos viewset, también devuelve contexto.
solo use get_serializer () en sus conjuntos de vistas
def get_serializer(self, *args, **kwargs):
"""
Return the serializer instance that should be used for validating and
deserializing input, and for serializing output.
"""
serializer_class = self.get_serializer_class()
kwargs[''context''] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
GenericViewSet
tiene el método
get_serializer_context
que puede anular:
class myModelViewSet(ModelViewSet):
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer
def get_serializer_context(self):
return {''request'': self.request}