Django自定义用户模型ORM无法获取全部字段问题求助
问题分析与解决
你看到的<TblUsuarios: juan@juan.com>只是Django模型实例的字符串展示形式,并非查询仅返回了email字段。实际上TblUsers.objects.get()或all()返回的是完整的模型实例,所有字段数据都存在,只是默认的__str__方法用USERNAME_FIELD(即你设置的email)作为显示内容。
验证方法
执行以下代码,直接访问实例的其他字段,就能获取对应数据:
user = TblUsers.objects.get(id=request.user.id) # 打印其他字段值 print(user.phone) print(user.date_joined) print(user.photo.url)
自定义实例显示内容
如果想让打印实例时显示更多字段,可以重写模型的__str__方法:
class TblUsers(AbstractUser): email = models.EmailField("email address", unique=True) is_staff = models.BooleanField(default=False) is_active = models.BooleanField(default=True) date_joined = models.DateTimeField(default=timezone.now) phone= models.CharField(max_length=11, blank=True, null=True) photo= models.ImageField(upload_to=upload_image, default = '/') USERNAME_FIELD = 'email' REQUIRED_FIELDS=(['username']) objects = UserManager() # 重写__str__方法 def __str__(self): return f"{self.email} | 用户名: {self.username} | 手机号: {self.phone or '未设置'}" class Meta: managed=True db_table = 'tbl_users'
这样之后,打印TblUsers实例时就会显示你定义的多字段内容。
额外提示
你的自定义管理器类名和继承的UserManager重名了,虽然当前不影响功能,但建议改名为CustomUserManager避免混淆:
class CustomUserManager(UserManager): # 原有代码不变 def create_user(self, email, password, **extra_fields): if not email: raise ValueError(_("The email must have info")) email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) user.save() return user def create_superuser(self, email, password, **extra_fields): extra_fields.setdefault("is_staff", True) extra_fields.setdefault("is_superuser", True) extra_fields.setdefault("is_active", True) if extra_fields.get("is_staff") is not True: raise ValueError(_("The superuser should have is_staff=True.")) if extra_fields.get("is_superuser") is not True: raise ValueError(_("The superuser should have is_superuser=True.")) return self.create_user(email, password, **extra_fields)
然后在模型中使用:
objects = CustomUserManager()
内容的提问来源于stack exchange,提问作者juan
相关产品推荐
相关产品推荐

