【问题标题】:Where to set the author as request.user在哪里设置作者为request.user
【发布时间】:2021-07-06 14:04:25
【问题描述】:

问题

在我的模型中,我有字段作者,我想通过 UserModel 与通过 JWT 令牌进行身份验证的用户一起作为 ForeignKey 输入。我的 API 和 JWT 身份验证工作正常,但我不知道在后端的哪里设置 author = request.user


我的代码:

apis.py

class AlarmstichworteCreateApi(ApiErrorsMixin, APIView):
    permission_classes = [IsAuthenticated]

    class InputSerializer(serializers.ModelSerializer):

        author = UserListAPI.OutputSerializer(source='UserListAPI_set', many=True)
        created = serializers.DateTimeField()
        updated = serializers.DateTimeField()
        name = serializers.CharField(max_length=100)
        class Meta:
            model = AlarmstichworteConfig
            fields = (
                '__all__'
            )

    def post(self, request, *args, **kwargs):
        serializer = self.InputSerializer(data=request.data)
#!      serializer = self.InputSerializer(data=request.data, author=request.user) # Try 1
        serializer.is_valid(raise_exception=True)

        create_alarmstichwort(**serializer.validated_data)
#!      create_alarmstichwort(**serializer.validated_data, author=request.user) # Try 1

        return Response(status=status.HTTP_201_CREATED)

services.py

def create_alarmstichwort(
    *,
    author: ForeignKey,
    created: datetime,
    updated: datetime,
    name: str,

) -> AlarmstichworteConfig:

    if AlarmstichworteConfig.objects.filter(id=id).exists():
        raise ValidationError('Alarmstichwort existiert bereits')

    alarmstichwort = AlarmstichworteConfig.objects.create(
        author=author,
        created=created,
        updated=updated,
        name=name,
    )
    alarmstichwort.full_clean()
    alarmstichwort.save()

    return alarmstichwort

如果有人可以帮助我,我会很高兴。非常感谢!

【问题讨论】:

  • 为什么create_alarmstichwort(**serializer.validated_data, author=request.user) 不适合你?这就是我会使用的。
  • @schillingt 然后,当我发布 api 帖子时,我收到错误 "author": ["This field is required."]

标签: django django-rest-framework django-views django-rest-framework-simplejwt


【解决方案1】:

感谢您在 cmets 中的澄清。如果您从序列化程序中删除author 字段,然后将其作为参数传递给create_alarmstichwort,就像您之前尝试的那样,值来自request.user,您将获得您想要的结果。这确实意味着您需要停止使用fields = "__all__"

【讨论】:

  • 非常感谢您的快速回答!既然你这么说,那么作者字段一定不能在序列化程序中是有道理的。
猜你喜欢
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2019-04-02
  • 2020-03-07
  • 2016-12-25
  • 1970-01-01
  • 2019-01-05
相关资源
最近更新 更多