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
相关产品推荐
相关产品推荐

