Django自定义用户模型查询报错:Field 'id'期望数字却获邮箱
问题:通过邮箱查询Profile时触发ValueError错误
自定义User模型(以邮箱作为用户名)
class User(AbstractUser): username = None email = models.EmailField(unique=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] objects = UserManager() def __str__(self): return self.email
api应用中的Profile模型
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) verified = models.BooleanField(default=False) def __str__(self): return self.user.email
序列化器代码
class ProfileSerializer(serializers.ModelSerializer): class Meta: model = Profile fields = ['user', 'verified']
视图代码
@api_view(['POST']) def get_user(request): email = request.data['email'] user = Profile.objects.get(user=email) serializer = ProfileSerializer(user) return Response(serializer.data)
触发的错误
当调用get_user接口并POST参数email=myuser@mydomain.com时,出现以下错误:
ValueError at /api/get/ Field 'id' expected a number but got 'myuser@mydomain.com'.
解决方案
错误原因是:Profile.objects.get(user=email)中,user是关联User模型的外键字段,Django默认会尝试用传入的字符串匹配User的主键(id字段,类型为数字),但你传入的是邮箱字符串,因此类型不匹配报错。
需要修改视图中的查询逻辑,通过双下划线关联查询匹配User的email字段:
修改后的视图代码
@api_view(['POST']) def get_user(request): email = request.data['email'] # 通过user__email匹配关联User的邮箱字段 profile = Profile.objects.get(user__email=email) serializer = ProfileSerializer(profile) return Response(serializer.data)
进阶优化(增加异常处理)
为了避免因参数缺失或用户不存在导致的服务器错误,可补充异常处理逻辑:
from django.core.exceptions import ObjectDoesNotExist from rest_framework import status @api_view(['POST']) def get_user(request): email = request.data.get('email') # 校验邮箱参数是否存在 if not email: return Response({'error': '邮箱参数不能为空'}, status=status.HTTP_400_BAD_REQUEST) try: profile = Profile.objects.get(user__email=email) serializer = ProfileSerializer(profile) return Response(serializer.data) except ObjectDoesNotExist: # 用户或Profile不存在时返回404 return Response({'error': '未找到对应用户的Profile信息'}, status=status.HTTP_404_NOT_FOUND)
内容的提问来源于stack exchange,提问作者Omid Shojaee
相关产品推荐
相关产品推荐

