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

Вернуться на верх