Django REST Framework创建任务时author_id非空约束错误如何解决?
错误原因
你遇到的非空约束报错,是因为Task模型的author外键字段为非空字段,但创建任务时没有给该字段赋值。DRF不会自动将当前登录用户关联到新建的资源上,需要手动完成配置。
解决方案
第一步:修改Task视图
重写get_queryset方法保证用户仅能查看自己创建的任务,重写perform_create方法自动为新建任务赋值当前登录用户为作者:
class TaskListCreateView(generics.ListCreateAPIView): permission_classes = [IsAuthenticated] serializer_class = TaskSerializer # 仅返回当前用户创建的任务 def get_queryset(self): return Task.objects.filter(author=self.request.user) # 创建任务时自动注入当前登录用户为作者 def perform_create(self, serializer): serializer.save(author=self.request.user)
第二步:修改Task序列化器
将author字段设为只读,避免要求前端传递该字段,同时可以在返回结果中展示作者信息:
class TaskSerializer(serializers.ModelSerializer): # 可选配置:如果需要返回作者邮箱而非id,可以添加该行 # author_email = serializers.ReadOnlyField(source='author.email') class Meta: model = Task fields = ('id', 'task_name', 'comments', 'status', 'author') # 新增author字段 read_only_fields = ['author'] # 标记为只读,无需前端传参
第三步:确认全局配置
检查settings.py中的DRF配置,确保已经启用JWT认证:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), }
前端调用创建任务接口时,需要在请求头中携带认证信息:Authorization: Bearer <获取到的access_token>,保证DRF可以正确识别当前登录用户。
内容的提问来源于stack exchange,提问作者Leo Nakamura
相关产品推荐
相关产品推荐

