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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:33:33