【问题标题】:Unable to get current user inside django rest serializer无法在 django rest 序列化程序中获取当前用户
【发布时间】:2022-11-22 12:12:10
【问题描述】:

我无法让当前用户进入序列化程序。我已经通过了上下文,但仍然出现错误

"user": [
        "This field is required."
    ]


#Serializer.py

class AddressSerializer(ModelSerializer):
    class Meta:
        model = Address
        fields = "__all__"

    def create(self, validated_data):
        request = self.context["request"]
        validated_data["user"] = request.user
        return super().create(validated_data)

#Views.py

class AddAddress(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        print(request.user)
        serializer = AddressSerializer(data=request.data, context={"request":request})
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, 200)
        return Response(serializer.errors)

#模型.py

class Address(models.Model):
    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    full_name = models.CharField(max_length=35)
    email = models.EmailField(max_length=100)
    phone = models.BigIntegerField()
    address_line_1 = models.TextField(max_length=500)
    address_line_2 = models.TextField(max_length=500)
    zip_code = models.IntegerField()
    city = models.CharField(max_length=20)
    state = models.CharField(max_length=15)
    country = models.CharField(max_length=15)

    class Meta:
        verbose_name_plural = "Address"

    def __str__(self):
        return self.full_name


我完全不知道这背后的问题

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以使用 save() 方法执行此操作

        class AddAddress(APIView):
            permission_classes = [IsAuthenticated]
        
            def post(self, request):
                print(request.user)
                serializer = AddressSerializer(data=request.data, context={"request":request})
                if serializer.is_valid():
                    serializer.save(user=request.user)
                    return Response(serializer.data, 200)
                return Response(serializer.errors)
    

    【讨论】:

    • 没有得到你
    【解决方案2】:

    尝试这个:

    request = self.context.get('request', None)
    

    而不是这个request = self.context["request"]

    【讨论】:

    • 嘿,我确实试过了,但仍然遇到同样的错误
    【解决方案3】:

    这是因为user在序列化器中是必需的,意味着user数据必须在post请求时发送。 从您的代码中,您想根据登录的用户添加地址。因此,user 无需由前端发送。尝试以下:

    class AddressSerializer(ModelSerializer):
        class Meta:
            model = Address
            fields = "__all__"
            extra_kwargs = {
                "user": {"read_only": True}
            }
    
        def validate(self, attrs):
            # make sure that you have passed request in context serializer
            attrs["user"] = self.context["request"].user 
            return attrs
    

    【讨论】:

    • 我必须让用户“只读”吗?因为我正在与用户创建地址(外键)
    • 序列化器中的read_only 意味着user 不需要由前端发送。您要使用当前登录用户创建地址吗?所以我们可以在def validate中传递user
    • user还在详细回复。我将删除上面答案中的第二个选项。
    猜你喜欢
    • 2022-11-22
    • 2021-11-21
    • 2016-10-03
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2016-10-29
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多