开启智能数字体验
Djacore CMS 驱动未来

基于Django 5.2的企业级智能内容管理系统,为千万级数据量设计, 提供安全、高效、可扩展的网站建设与内容管理一体化解决方案

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

:本站 2025-10-13 20:56:25 20

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开始,引入了 TextChoicesIntegerChoices类,这是目前​​最优雅和类型安全​​的方式:

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选项的字段的可读显示值。

任何带有 choices选项的字段(如 CharField, IntegerField)。

product_type字段选择为 (1, '电子商品')get_product_type_display()返回 '电子商品'

 

get_next_by_FOO()

按日期字段排序后,获取下一个对象。

DateFieldDateTimeField(若字段有 null=True,则方法名含 _null)。

createdDateTimeField)字段,可使用 get_next_by_created()

get_previous_by_FOO()

按日期字段排序后,获取上一个对象。

同上。

created字段,可使用 get_previous_by_created()

💡 理解get_FOO_display()的要点

  • ​工作方式​​:该方法返回的是字段在 choices选项中对应的显示文本(元组的第二个元素),而不是存储在数据库中的实际值(第一个元素)。例如,如果你的字段 statuschoices[('p', 'Publish'), ('d', 'Draft')],当 self.status'p'时,self.get_status_display()返回 'Publish'

  • ​枚举类型的应用​​:除了使用基本的二元元组列表,Django还支持通过枚举类(如 models.TextChoicesmodels.IntegerChoices)来定义选择项,这种方式更现代、更安全。get_FOO_display()方法同样适用于这些枚举类型定义的字段。

🧠 其他相关的模型方法

除了上述表格中的方法,Django模型还有其他一些重要的内置方法,理解它们有助于你更好地使用Django:

  • save()​:用于将对象保存到数据库。这是最常用的方法之一。

  • delete()​:用于从数据库中删除对象。

  • __str__()​:定义对象的“非正式”或显示字符串表示。在Django管理后台或打印对象时非常有用。

希望这些信息能帮助你更好地理解和使用Django模型的内置方法。如果你对 choices选项的具体定义或者其他方法有更深入的疑问,我很乐意继续探讨。

本文编辑:admin

更多文章:


使用DRF快速搭建API接口,Django REST Framework ModelViewSet 用法总结

使用DRF快速搭建API接口,Django REST Framework ModelViewSet 用法总结

Django REST Framework ModelViewSet 用法总结1. ModelViewSet 简介ModelViewSet是 Django REST Framework (DRF) 中的一个视图集类,它继承自多个 mixin

2026年3月1日 09:10

django 使用selenium注意事项:Service /usr/local/bin/chromedriver unexpectedly exited. Status code was: 1解决办法

django 使用selenium注意事项:Service /usr/local/bin/chromedriver unexpectedly exited. Status code was: 1解决办法

在实操当中有一项目需要使用selenium进行浏览器模拟,但是测试了很多都不行,最后通过了,总一下系统级安装chrome浏览器及驱动这些都不细说了测试项目运行用户:check_user.py建立一个API,使用check_user获取用户,

2026年1月6日 00:58

Django移除模型后的content_type操作

Django移除模型后的content_type操作

旧应用(apps.content.download)的模型虽然已删除,但其在 django_content_type表中的记录仍然存在,与新应用(user_space.apps.download)的记录产生了混淆。您需要清理这些过时的记录。

2025年12月22日 11:36

django.utils中都有哪些功能?django.utils工具都详情的举例说明

django.utils中都有哪些功能?django.utils工具都详情的举例说明

Django 的 django.utils模块是一个“百宝箱”,它提供了大量用于处理日常底层任务的实用工具。下面这个表格汇总了其中一些最常用的工具模块及其核心功能,可以帮助你快速了解其概貌。模块/工具类别主要功能/工具举例简要说明djang

2025年11月27日 22:32

Django 的基于类的视图总结,Django CBV类的详细使用方法整理

Django 的基于类的视图总结,Django CBV类的详细使用方法整理

Django 的基于类的视图(Class-based Views,简称 CBV)通过类的形式封装了常见的 Web 开发模式,提供了清晰的结构和强大的可复用性。下面这个表格汇总了这些核心基类的主要作用和典型应用场景,可以帮助你快速了解其用途。

2025年11月17日 08:52

Django transaction.atomic() 的具体作用和用法?

Django transaction.atomic() 的具体作用和用法?

transaction.atomic()是 Django 中用于管理数据库事务的核心工具,它能确保一系列数据库操作作为一个不可分割的“原子”单元来执行。下面这个表格能帮你快速抓住要点。特性说明核心目标保证一系列数据库操作的原子性(Atomi

2025年10月31日 23:35

django 批量操作的方法有哪些?如何高效的批量更新django内容

django 批量操作的方法有哪些?如何高效的批量更新django内容

Django 提供了多种批量操作方法,能显著提升数据库操作的效率,特别是在处理大量数据时。下面为你梳理这些方法,并说明其适用场景和注意事项。下表总结了主要的批量操作方法及其核心用途:方法类别核心方法主要用途关键特点📦 批量创建bulk_cr

2025年10月31日 23:30

django的分页器以及django分页器中有哪些变量

django的分页器以及django分页器中有哪些变量

Django 的分页器(Paginator)是一个用于管理数据分页的强大工具,它能将大量数据分割成多个页面,并生成相应的导航链接。下面这个表格汇总了 Django 分页器中的核心类及其主要属性和方法,方便你快速了解其构成。组件/类别名称说明

2025年10月20日 10:16

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

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

在Django中有一种方法被称为 ​​get_FOO_display() 方法​​,对模型中定义了 choices选项的字段名的灵活使用方法。在Django中,choices参数用于为模型字段提供一组固定的可选值,它在数据库层面存储简洁的值

2025年10月13日 20:56

django​​字段查找(Field Lookups)总结,django​​查询中指定特定的条件或对字段的处理方法

django​​字段查找(Field Lookups)总结,django​​查询中指定特定的条件或对字段的处理方法

在Django ORM中,双下划线 __后跟的关键词(如 __date、__icontains)被称为​​字段查找(Field Lookups)​​。它们用于在查询中指定特定的条件或对字段进行某种处理。&nbsp;📊

2025年10月8日 23:07

最近更新

使用DRF快速搭建API接口,Django REST Framework ModelViewSet 用法总结
2026-03-01 09:10:09 浏览:4
宝塔Nginx免费防火墙常用UA防护正则
2026-01-20 00:53:21 浏览:38
django 使用selenium注意事项:Service /usr/local/bin/chromedriver unexpectedly exited. Status code was: 1解决办法
2026-01-06 00:58:37 浏览:10
Django移除模型后的content_type操作
2025-12-22 11:36:29 浏览:6
热门文章

DjancoreCMS打包前操作
2025-05-26 17:58:05 浏览:81
宝塔Nginx免费防火墙常用UA防护正则
2026-01-20 00:53:21 浏览:38
标签列表