Как принудительно ввести текущего пользователя в поле в Django Rest Framework
Рассмотрим, что у меня есть модели, сериализатор и набор представлений, как показано ниже:
# 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()
Итак, когда я отправляю POST запрос на /api/foos/
с пустым телом, он создает экземпляр Foo
с полем owner
, установленным на текущего зарегистрированного пользователя, что нормально.
Однако я также хочу полностью игнорировать то, что текущий аутентифицированный пользователь отправляет в качестве значения в owner
. Например, если я сделаю POST запрос к /api/foos/
с телом user=5
(другой пользователь, по сути), CurrentUserDefault
установит Foo.owner
этому пользователю, а это не то поведение, которое я хочу иметь.
Я всегда хочу иметь текущего аутентифицированного пользователя в качестве значения поля owner
нового экземпляра Foo
, или, другими словами, я хочу, чтобы поле FooSerializer.owner
было установлено как текущий аутентифицированный пользователь в качестве значения и игнорировало то, что отправляется в POST-запросе в качестве значения owner
.
Как мне это сделать?
Заранее спасибо.
Environment
- django ^2.2
- djangorestframework ^3.12.4
Поскольку вы не хотите, чтобы поле owner
было изменяемым через ваш сериализатор, я бы предложил вам удалить поле из сериализатора или сделать его только для чтения.
Затем вы можете установить владельца, используя метод сериализатора save
, который позволяет вводить дополнительные данные.
Хорошим местом для этого в вашем примере был бы метод perform_create
вашего ModelViewSet
. Например:
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)