Django get_FOO_display() 方法,Django模型中原生方法总结

在Django中有一种方法被称为 get_FOO_display() 方法,对模型中定义了 choices选项的字段名的灵活使用方法。
在Django中,choices参数用于为模型字段提供一组固定的可选值,它在数据库层面存储简洁的值(如代码或数字),但在表单和显示时使用更友好易懂的文本。下面为你介绍其标准使用方法、最佳实践以及一个开源生态项目。
💡 标准使用方法
choices参数接收一个由二元组构成的列表或元组。每个二元组的第一个元素是实际存储在数据库中的值,第二个元素是对用户友好的显示描述。
1. 基础定义方式
最直接的方式是定义一个包含所有选项的元组序列:
from django.db import models
class Student(models.Model):
# 定义choices选项
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
]
# 在字段中使用
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default='FR' # 可以设置默认值
)
2. 使用模型类常量(推荐)
为了提高代码的可读性和可维护性,官方建议将选项定义为模型类内部的常量:
class Student(models.Model):
# 定义常量
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
]
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN # 使用常量作为默认值
)这种方式的好处是,在代码的其他部分可以使用 Student.FRESHMAN这样的常量,避免硬编码字符串或数字。
3. 使用枚举类(Django 3.0+ 强烈推荐)
从Django 3.0开始,引入了 TextChoices和 IntegerChoices类,这是目前最优雅和类型安全的方式:
from django.db import models
class Student(models.Model):
# 使用TextChoices枚举(适用于字符串值)
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', 'Freshman'
SOPHOMORE = 'SO', 'Sophomore'
JUNIOR = 'JR', 'Junior'
SENIOR = 'SR', 'Senior'
year_in_school = models.CharField(
max_length=2,
choices=YearInSchool.choices,
default=YearInSchool.FRESHMAN
)
# 对于数值型选项,可以使用IntegerChoices
class Suit(models.IntegerChoices):
DIAMOND = 1
SPADE = 2
HEART = 3
CLUB = 4
suit = models.IntegerField(choices=Suit.choices)枚举类提供了更好的IDE支持,能有效避免拼写错误,并且选项本身就是一个完整的类型。
🛠️ 使用技巧与注意事项
1. 获取显示值
在模板或Python代码中,可以使用 get_FOO_display()方法获取选项的友好显示文本,其中 FOO是字段名。
# 在Python代码中
student = Student.objects.get(pk=1)
print(student.year_in_school) # 输出存储的值,例如 'FR'
print(student.get_year_in_school_display()) # 输出显示文本 'Freshman'{# 在Django模板中 #}
<p>年级: {{ student.get_year_in_school_display }}</p>2. 字段类型匹配
确保字段的类型与choices中定义的实际值类型一致。例如,如果选项的第一个元素是整数,字段应使用 IntegerField;如果是字符串,则使用 CharField。
3. 何时使用choices
当一个字段的所有可能值可以完全列举时,就适合使用choices参数,例如:性别、学历、订单状态、产品分类等。
下面这个表格帮你快速了解这个方法和Django自动生成的其他类似方法。
💡 理解get_FOO_display()的要点
工作方式:该方法返回的是字段在
choices选项中对应的显示文本(元组的第二个元素),而不是存储在数据库中的实际值(第一个元素)。例如,如果你的字段status的choices是[('p', 'Publish'), ('d', 'Draft')],当self.status为'p'时,self.get_status_display()返回'Publish'。枚举类型的应用:除了使用基本的二元元组列表,Django还支持通过枚举类(如
models.TextChoices和models.IntegerChoices)来定义选择项,这种方式更现代、更安全。get_FOO_display()方法同样适用于这些枚举类型定义的字段。
🧠 其他相关的模型方法
除了上述表格中的方法,Django模型还有其他一些重要的内置方法,理解它们有助于你更好地使用Django:
save():用于将对象保存到数据库。这是最常用的方法之一。
delete():用于从数据库中删除对象。
__str__():定义对象的“非正式”或显示字符串表示。在Django管理后台或打印对象时非常有用。
希望这些信息能帮助你更好地理解和使用Django模型的内置方法。如果你对 choices选项的具体定义或者其他方法有更深入的疑问,我很乐意继续探讨。
更多文章:
使用DRF快速搭建API接口,Django REST Framework ModelViewSet 用法总结
2026年3月1日 09:10
django.utils中都有哪些功能?django.utils工具都详情的举例说明
2025年11月27日 22:32
Django 的基于类的视图总结,Django CBV类的详细使用方法整理
2025年11月17日 08:52
Django transaction.atomic() 的具体作用和用法?
2025年10月31日 23:35
django 批量操作的方法有哪些?如何高效的批量更新django内容
2025年10月31日 23:30
Django get_FOO_display() 方法,Django模型中原生方法总结
2025年10月13日 20:56
django字段查找(Field Lookups)总结,django查询中指定特定的条件或对字段的处理方法
2025年10月8日 23:07

















