Django post_save信号报错:expected string or bytes-like object求助
问题排查与解决
核心错误点
你的用户管理器create_user方法里存在明显逻辑错误:
name = self.normalize_email(name)
normalize_email是Django专门用于标准化邮箱地址的方法,它会对邮箱字符串做格式处理(比如转换小写、处理域名等),但你却把用户名name传入了这个方法。当传入的字符串不是合法邮箱格式时,该方法内部的解析逻辑会出错,最终在user.save()触发模型验证/数据库写入时抛出expected string or bytes-like object异常。
修复方案
直接删除这行错误的代码,因为用户名不需要用邮箱标准化方法处理:
def create_user(self, name, email, password, **extra_fields): """ Create and save a User with the given email and password. """ if not email: raise ValueError(_('The Email must be set')) # 移除错误的name标准化行 email = self.normalize_email(email) user = self.model(name=name, email=email, **extra_fields) user.set_password(password) user.save() return user
额外排查方向
如果修复后仍有问题,可以从以下方向继续排查:
- 检查
CustomUser模型的name字段定义,确认它是CharField等字符串类型,没有误加邮箱验证器或其他特殊约束。 - 验证
schema_context(tenant)是否正确切换了租户:确认tenant对象的schema名称有效,且该schema已在数据库中创建。 - 查看完整的报错堆栈追踪,定位到异常的具体触发位置(比如是模型字段验证、数据库驱动层还是其他环节),这能更精准定位问题。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

