DRF邮箱存储端点报IntegrityError,user_id不可为null求助
解决DRF创建邮箱时的IntegrityError问题
问题原因
你的EmailAddress模型中user是必填外键,但创建接口时没有自动关联当前登录用户,且序列化器将user设为只读字段,导致数据库收到的user_id为null,触发完整性错误。
解决方案
方法一:重写ViewSet的perform_create方法(推荐)
在views.py的EmailAddressViewSet中添加perform_create方法,直接将当前登录用户绑定到新创建的邮箱记录:
from rest_framework import viewsets, permissions import account_models import serializers class EmailAddressViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsAuthenticated,) serializer_class = serializers.EmailAddressSerializer def get_queryset(self): return account_models.EmailAddress.objects.filter(user=self.request.user) # 新增方法:绑定当前登录用户 def perform_create(self, serializer): serializer.save(user=self.request.user)
方法二:重写Serializer的create方法
修改serializers.py,让序列化器在创建时自动获取当前登录用户:
from rest_framework import serializers import account_models class EmailAddressSerializer(serializers.ModelSerializer): class Meta: model = account_models.EmailAddress # 移除user字段,避免前端传递或看到该字段 fields = ['email', 'verified', 'created', 'verification_sent', 'reset_sent'] read_only_fields = ['verified', 'created', 'verification_sent', 'reset_sent'] def create(self, validated_data): # 从请求上下文获取当前登录用户 user = self.context['request'].user return account_models.EmailAddress.objects.create(user=user, **validated_data)
额外优化
- 序列化器中可完全移除
user字段,因为用户无需操作该字段,也无需在响应中返回(若业务不需要)。 - 确认
permission_classes = (permissions.IsAuthenticated,)已生效,确保只有登录用户能调用该接口。
内容的提问来源于stack exchange,提问作者anon says hello
相关产品推荐
相关产品推荐

