update serializermethodfield queryset password jsonfield framework foreign django-rest-framework

django rest framework - serializermethodfield - Cómo proporcionar programáticamente `queryset` a PrimaryKeyRelatedField en DRF 3



partial update django rest framework (3)

La vista tiene un

self.request.user

atributo que puede usar para buscar el conjunto de consulta relacionado con el usuario, por ejemplo

queryset = Products.objects.get(customer=self.request.user)

Para tener un PrimaryKeyRelatedField no de solo lectura, debe proporcionar un conjunto de consulta que contenga opciones válidas.

¿Cómo puedo llenar correctamente ese queryset basado en la solicitud actual (usuario)?


Puede usar request.user en su serializador, a través del contexto del serializador :

# views.py class MyView(APIView): def post(self, request, *args, **kwargs): serializer = MySerializer(data=data, context={''current_user'': self.request.user})

Luego, en su serializador, puede acceder al request.user con:

self.context.get(''current_user'')


La clave es PrimaryKeyRelatedField subclase de PrimaryKeyRelatedField y sobrecargar el método get_queryset , utilizando la información del usuario del contexto de la solicitud:

class UserFilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): def get_queryset(self): request = self.context.get(''request'', None) queryset = super(UserFilteredPrimaryKeyRelatedField, self).get_queryset() if not request or not queryset: return None return queryset.filter(user=request.user)

A continuación, puede usar este nuevo serializador como el original (sin filtrar):

class MySerializer(serializers.ModelSerializer): related = UserFilteredPrimaryKeyRelatedField(queryset=MyModel.objects)

Siempre que el serializador acceda al conjunto de consulta, se filtrará de manera que solo se devuelvan los objetos que posee el usuario actual.