为什么Django模型中full_name变量报TypeError,改为方法后就正常?
原因解释
核心差异是两段代码的执行时机完全不同,和逻辑无关:
- 第一种写为类属性的写法,计算发生在
user类的定义阶段:
此时你直接操作的first_name、last_name只是models.CharField的实例对象,作用是定义模型的字段结构,不是某一条用户数据里存储的具体字符串值,拿字段对象和字符串做+运算,自然会触发类型不支持的报错。 - 第二种写为实例方法的写法,计算发生在实例调用阶段:
只有当你已经生成了user类的实例(比如从数据库查询到某条具体的用户记录),才会调用full_name()方法,此时通过self.first_name取到的是这条记录对应的实际存储的字符串值,两个字符串拼接自然不会报错。
如果你想要用类似属性的方式调用full_name不需要加括号,也可以给方法加上@property装饰器:
from django.db import models class user(models.Model): first_name = models.CharField(max_length=200) last_name = models.CharField(max_length=200) @property def full_name(self): return self.first_name + ' ' + self.last_name def __str__(self): return self.full_name
内容的提问来源于stack exchange,提问作者Sirhk
相关产品推荐
相关产品推荐

