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

Django Ninja中Email字段验证失效问题求助

问题解决方案

核心问题分析

你当前的邮箱验证无效,是因为UserSchema从Django模型继承的email字段默认是普通字符串类型,Pydantic不会自动做邮箱格式校验;后续视图里手动转换EmailStr的操作不仅多余,还可能破坏数据传递流程,导致存储异常。

修改步骤及代码示例

1. 修正Schema定义,添加邮箱类型校验

在Schema层直接指定email字段为EmailStr,让Pydantic在请求接收阶段就完成格式验证:

from pydantic import EmailStr
from ninja import ModelSchema
from .models import User

class UserSchema(ModelSchema):
    # 明确指定email字段类型为EmailStr,覆盖模型默认的字符串类型
    email: EmailStr
    
    class Config:
        model = User
        model_fields = ["username", "first_name", "last_name", "email"]

class CreateUserSchema(UserSchema):
    password: str

2. 简化视图逻辑,移除手动转换操作

Schema已经完成邮箱验证,直接使用user_data中的字段即可:

async def register(request, user_data: schemas.CreateUserSchema):
    # 无需手动转换EmailStr,user_data.email已通过校验
    user = User.objects.create_user(
        username=user_data.username,
        email=user_data.email,
        password=user_data.password,
        first_name=user_data.first_name,
        last_name=user_data.last_name
    )
    # 后续返回响应逻辑...

3. 数据库层面补充约束(可选但推荐)

确保Django模型的email字段使用EmailField,实现数据库层面的格式校验:

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=150, unique=True)
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    # 使用EmailField替代CharField
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=128)
    # 其他字段...

说明

  • 现在请求传入非法邮箱格式时,Django Ninja会直接返回422错误,无需手动处理验证逻辑。
  • 移除视图中的手动转换后,数据传递流程更清晰,也避免了因转换导致的存储异常。

内容的提问来源于stack exchange,提问作者CC7052

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:45:54