You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Serializer中无法获取当前用户,传context仍报错

Django REST Serializer 无法自动填充当前用户导致字段必填错误

问题现象

已经向序列化器传递了context,但仍收到以下字段必填错误:

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

Models.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

问题原因

序列化器的fields = "__all__"会将user字段纳入验证规则,而前端请求未传递user值。create方法仅在serializer.is_valid()通过后才会执行,因此你在create中填充user的代码根本没机会运行,验证阶段就直接抛出了字段必填错误。

解决方法

有两种常用修复方式:

方法一:将user字段设为只读

在序列化器中显式定义user字段并标记为read_only=True,让验证阶段跳过该字段检查,后续在create方法中手动填充用户:

from rest_framework import serializers

class AddressSerializer(ModelSerializer):
    # 标记user为只读字段,避免验证阶段报错
    user = serializers.PrimaryKeyRelatedField(read_only=True)
    
    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)

方法二:使用CurrentUserDefault自动填充

利用DRF内置的CurrentUserDefault,直接在字段定义中指定默认值为当前用户,无需手动在create中处理:

from rest_framework import serializers

class AddressSerializer(ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(
        queryset=Account.objects.all(),
        default=serializers.CurrentUserDefault()
    )
    
    class Meta:
        model = Address
        fields = "__all__"

只要context中包含request,DRF会自动将当前用户填充到user字段,验证阶段即可通过。

内容的提问来源于stack exchange,提问作者Sins97

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:40:52