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

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中的这种操作只是生成了本地对象,未与数据库进行查询交互。
  • 正确读取数据库用户的方式:
    1. 通过get()方法查询数据库:
      # 根据id查询
      antoine = User.objects.get(id=4)
      print(antoine.username)  # 输出数据库中该用户的真实username值
      
      # 根据username查询
      b = User.objects.get(username='antoine')
      print(b.id)  # 输出数据库中该用户的真实id值
      
    2. 若需查询多个用户,可使用filter()方法:
      users = User.objects.filter(username__contains='antoine')
      
  • 额外说明:User(xxx=yyy)仅用于创建新的未保存用户对象,调用save()方法后才会将该对象写入数据库;若要获取已存在的用户数据,必须通过objects管理器的查询方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:01:22