Considere que tengo modelos, un serializador y un conjunto de vistas como se muestra a continuación:
# models.py class Foo(models.Model): owner = models.ForeignKey(User, models.CASCADE, related_name="bars") # serializers.py class FooSerializer(serializers.ModelSerializer): owner = serializers.PrimaryKeyRelatedField( default=serializers.CurrentUserDefault(), queryset=User.objects.all(), ) class Meta: fields = ["pk", "owner"] # viewsets.py # registered to /api/foos/ class FooViewSet(viewsets.ModelViewSet): serializer_class = FooSerializer permission_classes = [permissions.IsAuthenticated] queryset = Foo.objects.all() Entonces, cuando envío una solicitud POST a /api/foos/ con un cuerpo vacío, crea una instancia de Foo con su campo de owner establecido en el usuario que inició sesión actualmente, lo cual está bien.
Sin embargo, también quiero ignorar por completo lo que el usuario actualmente autenticado envía como valor al owner . Por ejemplo, si hago una solicitud POST a /api/foos/ con body user=5 (otro usuario, básicamente), CurrentUserDefault establece Foo.owner para ese usuario, que no es el comportamiento que quiero tener.
Siempre quiero tener el usuario autenticado actual como el valor del owner del campo de una nueva instancia de Foo o, en otras palabras, quiero que el campo FooSerializer.owner se establezca como usuario autenticado actualmente como un valor e ignorar lo que se envía en Solicitud POST como valor de owner .
¿Cómo puedo hacer eso?
Gracias por adelantado.
Dado que no desea que el owner sea modificable a través de su serializador, le sugiero que elimine el campo del serializador o que sea de solo lectura .
A continuación, puede establecer el propietario utilizando el método de save del serializador que le permite inyectar datos adicionales .
Un buen lugar para esto en su ejemplo sería el método perform_create de su ModelViewSet . Por ejemplo:
class FooViewSet(viewsets.ModelViewSet): serializer_class = FooSerializer permission_classes = [permissions.IsAuthenticated] queryset = Foo.objects.all() def perform_create(self, serializer): serializer.save(owner=self.request.user)