Django REST Framework中AccessKeys表user_id字段存值为空问题求助
我来帮你搞定这个问题!你的user_id一直为null主要有几个核心问题,咱们一步步修改就能解决:
1. 先修正模型的反向关联名称(可选但推荐)
你当前AccessKeys模型里的related_name='user'会和CustomUser本身的属性冲突,改成access_keys更合理,这样后续你可以通过user.access_keys.all()轻松获取某个用户的所有访问密钥,反向关联逻辑更清晰:
# models.py class AccessKeys(models.Model): # 修改related_name为access_keys,可移除null=True(如果业务要求每个密钥必须属于用户) user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='access_keys') access_keys = models.CharField(max_length=400) def __str__(self): return self.access_keys
2. 修复序列化器的字段定义错误
你原来的user_id字段source='CustomUser'是错误的——source应该指向当前模型(AccessKeys)的字段,而不是关联的模型类名。我们可以让序列化器自动处理用户字段,同时设置为只读(因为用户信息由后端自动填充,不需要前端传入):
# serializers.py class AccessKeySerializer(serializers.ModelSerializer): # 可选:显式定义user_id,关联到user字段的id user_id = serializers.PrimaryKeyRelatedField(source='user', read_only=True) class Meta: model = AccessKeys fields = ['id', 'user_id', 'access_keys'] # 或者直接让序列化器处理user字段,设置为只读 # fields = ['id', 'user', 'access_keys'] # read_only_fields = ['user']
3. 视图层关键:传递当前登录用户到保存方法
这是导致user_id为null的核心原因!你在调用serializer.save()时,没有把当前登录的用户传递进去。因为视图已经配置了IsAuthenticated权限,request.user就是有效的CustomUser实例,直接传给save方法即可:
# views.py class AccessKeyView(generics.ListCreateAPIView): permission_classes = [IsAuthenticated, ] queryset = AccessKeys.objects.all() serializer_class = AccessKeySerializer def post(self, request): serializer = self.serializer_class(data=request.data) if serializer.is_valid(): # 重点:把当前登录用户传入save方法,自动关联到AccessKeys的user字段 serializer.save(user=request.user) return Response(serializer.data, status=HTTP_201_CREATED) return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
这样修改后,当用户发送POST请求创建access_key时,后端会自动把当前登录用户的信息关联到新创建的AccessKeys记录中,user_id就不会再是null啦!
内容的提问来源于stack exchange,提问作者Meera
相关产品推荐
相关产品推荐

