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.