viewset update queryset modelserializer method framework errors create django django-rest-framework serializer

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}