Как принудительно ввести текущего пользователя в поле в 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)