如何强制当前用户进入 Django Rest Framework 中的字段

How to Force Current User to a Field in 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()

因此,当我向 /api/foos/ 发送一个空主体的 POST 请求时,它会创建一个 Foo 实例,其 owner 字段设置为当前记录的-在用户中,这很好。

但是,我也想完全忽略当前经过身份验证的用户作为值发送给 owner 的内容。例如,如果我使用正文 user=5(基本上是另一个用户)向 /api/foos/ 发出 POST 请求,则 CurrentUserDefault 会将 Foo.owner 设置为该用户,这这不是我想要的行为。

我总是希望将当前经过身份验证的用户作为新 Foo 实例的字段 owner 的值,或者换句话说,我希望 FooSerializer.owner 字段被设置为当前经过身份验证的用户作为值,忽略在 POST 请求上发送的内容作为值 owner.

我该怎么做?

提前致谢。


环境

由于您不希望 owner 可以通过您的序列化程序进行修改,我建议您从序列化程序中删除该字段或将其设为 read-only.

然后您可以使用序列化程序的 save 方法设置所有者,该方法允许您 inject additional data.

在您的示例中,一个很好的地方是 ModelViewSetperform_create method。例如:

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)