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

Django自定义用户模型下创建文章时IntegrityError无法解决

解决创建文章时的IntegrityError错误

错误原因

NOT NULL constraint failed: blog_post.author_id 表明创建Post记录时,author_id字段为空,但Post模型中author字段是必填项(未设置null=True或默认值)。当前的文章创建视图没有自动将当前登录用户关联到文章的author字段,导致保存时触发数据库非空约束错误。

解决方案

方法1:重写视图的perform_create方法(推荐)

直接在CreatePost视图中添加逻辑,保存文章时自动将当前登录用户设置为作者:

class CreatePost(generics.CreateAPIView):
    permission_classes = [permissions.IsAuthenticated]
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def perform_create(self, serializer):
        # 将当前登录用户赋值给文章的author字段
        serializer.save(author=self.request.user)

这个方法逻辑集中在视图层,符合DRF设计规范,无需修改序列化器,同时能确保文章作者只能是当前登录用户,避免前端随意指定。

方法2:修改序列化器自动关联当前用户

如果希望逻辑放在序列化器层,可以通过以下两种方式实现:

方式A:使用HiddenField和CurrentUserDefault

from rest_framework.serializers import CurrentUserDefault

class PostSerializer(serializers.ModelSerializer):
    # 隐藏author字段,默认值为当前登录用户
    author = serializers.HiddenField(default=CurrentUserDefault())
    
    class Meta:
        model = Post
        fields = ('post_id', 'category', 'title', 'author', 'content', 'excerpt', 'slug', 'status', 'photo')

方式B:重写序列化器的create方法

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('post_id', 'category', 'title', 'author', 'content', 'excerpt', 'slug', 'status', 'photo')

    def create(self, validated_data):
        # 从上下文获取当前登录用户,添加到验证数据中
        validated_data['author'] = self.context['request'].user
        return super().create(validated_data)

额外检查点

  1. 确保访问/api/admin/create/的用户已通过身份验证(视图已设置IsAuthenticated权限,符合要求)。
  2. 若前端请求中包含author字段,方法1会自动覆盖该值,确保作者为当前登录用户;若需要允许前端指定作者(不推荐),则需调整逻辑并确保传递的用户ID有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:37:45