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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:46:57