如何将Django模型的Field.choices统一存储并跨模型调用?
实现Django Choices的跨模型统一管理
完全可行!这其实是Django项目里管理通用choices非常推荐的做法,能大大提升代码的可维护性,不用在每个模型里重复写相同的选项。具体操作步骤如下:
创建统一的choices管理文件
在你的Django项目中(建议放在某个app目录下,比如和业务模型同目录,或者单独创建一个utils类的app来存放通用配置),新建一个名为mychoice.py的文件,把你原来定义的所有choices和对应的常量都移进去:# mychoice.py # 学年选项 YEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), ) # 定义对应常量,方便调用默认值 FRESHMAN = 'FR' SOPHOMORE = 'SO' JUNIOR = 'JR' SENIOR = 'SR' # 媒体类型选项 MEDIA_CHOICES = ( ('Audio', ( ('vinyl', 'Vinyl'), ('cd', 'CD'), )), ('Video', ( ('vhs', 'VHS Tape'), ('dvd', 'DVD'), )), ('unknown', 'Unknown'), )在模型中导入并引用
打开需要使用这些choices的模型文件(比如models.py),通过导入语句引入需要的选项和常量,然后在字段中直接使用:# models.py from django.db import models # 按需导入需要的内容,也可以直接import mychoice后用mychoice.YEAR_IN_SCHOOL_CHOICES from mychoice import YEAR_IN_SCHOOL_CHOICES, FRESHMAN class Student(models.Model): year_in_school = models.CharField( max_length=2, choices=YEAR_IN_SCHOOL_CHOICES, default=FRESHMAN, )注意导入路径问题
- 如果
mychoice.py和你的models.py在同一个app目录下,直接像上面那样导入就没问题; - 如果是放在项目根目录(和
manage.py同层级),需要确保该目录在Python的搜索路径中,或者使用相对导入; - 更推荐的做法是把这类通用配置放在一个专门的
utilsapp里,这样跨多个app引用时,导入路径会更清晰,比如from utils.mychoice import MEDIA_CHOICES。
- 如果
额外小提示:后续如果需要修改某个选项的文字或者新增选项,只需要修改mychoice.py这一个文件,所有引用该选项的模型都会自动生效,不用逐个修改模型,非常省心!
内容的提问来源于stack exchange,提问作者Majid Hojati
相关产品推荐
相关产品推荐

