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)
额外检查点
- 确保访问
/api/admin/create/的用户已通过身份验证(视图已设置IsAuthenticated权限,符合要求)。 - 若前端请求中包含
author字段,方法1会自动覆盖该值,确保作者为当前登录用户;若需要允许前端指定作者(不推荐),则需调整逻辑并确保传递的用户ID有效。
内容的提问来源于stack exchange,提问作者DevolamiTech
相关产品推荐
相关产品推荐

