无法在django rest序列化程序中获取当前用户

ar5n3qh5  于 2022-11-26  发布在  Go
关注(0)|答案(4)|浏览(125)

我无法在序列化程序中获取当前用户。我已传递了上下文,但仍收到如下错误

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

序列化程序.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)

查看次数.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

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

qhhrdooz

qhhrdooz1#

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

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)
z0qdvdin

z0qdvdin2#

试试这个:

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

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

jfewjypa

jfewjypa3#

因为user是序列化器中必需的,这意味着当post请求时必须发送user数据。从您的代码中,您希望根据登录的用户添加地址。因此,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
uplii1fm

uplii1fm4#

它是一个外键。您需要为其分配ID,而不是整个用户。validated_data[“user”] = request.user.id
如果错误仍然存在,则问题似乎是validated_data中没有“user”字段。您在请求中发送到序列化程序的数据存在问题。如果它与必需字段不匹配,则验证数据将为空。请打印并检查验证数据以及请求数据。

相关问题