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
相关产品推荐
相关产品推荐

