Django自定义User模型创建用户后Shell查询异常求助
Django自定义User模型Shell实例字段缺失问题解决
问题
通过继承AbstractUser定义了自定义User模型,Django admin后台创建用户后所有字段显示正常,但在Django Shell中使用User(id=4)或User(username='antoine')创建实例时,无法获取完整用户字段值:例如antoine实例的username为空,b实例的id为空。
自定义User模型代码:
class User(AbstractUser): phone_number = models.CharField(max_length=64) department = models.CharField(max_length=128) misc_settings = models.JSONField(null=True, blank=True) RelatedGroup = models.ManyToManyField(Group, related_name='GroupMember')
Shell操作记录:
In [1]: from accounts.models import User In [2]: antoine = User(id=4) In [3]: antoine.id Out[3]: 4 In [4]: b = User(username="antoine") In [5]: b.id In [6]: b.username Out[6]: 'antoine' In [7]: antoine.username Out[7]: ''
解决方法
- 核心原因:直接调用
User(id=4)这类方式创建的是内存中的空实例,仅会设置你传入的字段值,并不会从数据库中读取对应id的真实用户数据。Admin后台显示的是数据库存储的真实数据,而Shell中的这种操作只是生成了本地对象,未与数据库进行查询交互。 - 正确读取数据库用户的方式:
- 通过
get()方法查询数据库:# 根据id查询 antoine = User.objects.get(id=4) print(antoine.username) # 输出数据库中该用户的真实username值# 根据username查询 b = User.objects.get(username='antoine') print(b.id) # 输出数据库中该用户的真实id值 - 若需查询多个用户,可使用
filter()方法:users = User.objects.filter(username__contains='antoine')
- 通过
- 额外说明:
User(xxx=yyy)仅用于创建新的未保存用户对象,调用save()方法后才会将该对象写入数据库;若要获取已存在的用户数据,必须通过objects管理器的查询方法。
内容的提问来源于stack exchange,提问作者lmdulz
相关产品推荐
相关产品推荐

