如何强制当前用户进入 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
.
我该怎么做?
提前致谢。
环境
- django ^2.2
- djangorest 框架 ^3.12.4
由于您不希望 owner
可以通过您的序列化程序进行修改,我建议您从序列化程序中删除该字段或将其设为 read-only.
然后您可以使用序列化程序的 save
方法设置所有者,该方法允许您 inject additional data.
在您的示例中,一个很好的地方是 ModelViewSet
的 perform_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)
假设我有如下模型、序列化程序和视图集:
# 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
.
我该怎么做?
提前致谢。
环境
- django ^2.2
- djangorest 框架 ^3.12.4
由于您不希望 owner
可以通过您的序列化程序进行修改,我建议您从序列化程序中删除该字段或将其设为 read-only.
然后您可以使用序列化程序的 save
方法设置所有者,该方法允许您 inject additional data.
在您的示例中,一个很好的地方是 ModelViewSet
的 perform_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)