Django模型choices外部访问及字典设置方式技术问询
嘿,这两个都是Django模型开发里关于choices的常见问题,我来给你详细拆解解答:
问题1:Django模型类内定义的choices能否在模型类以外的位置访问?
当然可以!因为你在模型类里定义的choices本质是类属性,只要你能在外部导入对应的模型类,就能直接访问它。
举个实际的例子,假设你的模型是这样写的:
from django.db import models class Movie(models.Model): MOVIE_CHOICES = [ ('INVIC', 'Invictus'), ('STAR', 'Star Wars'), ] title = models.CharField(max_length=50, choices=MOVIE_CHOICES)
那在模型外部(比如视图函数、脚本或者其他模块里),你只需要导入Movie模型,就能直接获取这个choices列表:
from myapp.models import Movie # 获取完整的choices键值对列表 print(Movie.MOVIE_CHOICES) # 输出结果: [('INVIC', 'Invictus'), ('STAR', 'Star Wars')]
问题2:如何在模型类外部通过键访问MOVIE_CHOICES对应的值?能否使用字典设置choices的值?
我分成两个小部分来回答:
通过键获取对应显示值的方法
有两种常用的方式,看你的场景来选:
方式1:将choices转换为字典使用
如果你需要在没有模型实例的情况下直接通过键查值,可以把choices列表转换成字典:
from myapp.models import Movie # 把choices列表转成字典 movie_choice_map = dict(Movie.MOVIE_CHOICES) # 通过键获取对应的值 print(movie_choice_map['INVIC']) # 输出: Invictus
更省心的做法是在模型类里同时定义字典和对应的choices,这样内外都能直接用:
class Movie(models.Model): # 先定义字典,方便直接键值查找 MOVIE_CHOICES_MAP = { 'INVIC': 'Invictus', 'STAR': 'Star Wars', } # 把字典转换成Django要求的choices格式(列表元组) MOVIE_CHOICES = [(key, value) for key, value in MOVIE_CHOICES_MAP.items()] title = models.CharField(max_length=50, choices=MOVIE_CHOICES)
之后在外部直接用Movie.MOVIE_CHOICES_MAP['INVIC']就能拿到对应的值,非常方便。
方式2:使用模型实例的get_xxx_display()方法
如果你已经查询到了模型实例,那Django自带的get_<字段名>_display()方法是最省事的:
# 查询到对应的电影实例 movie = Movie.objects.get(title='INVIC') # 调用内置方法获取显示文本 print(movie.get_title_display()) # 输出: Invictus
这个方法是Django自动为带有choices参数的字段生成的,不用自己额外写逻辑。
能否用字典直接设置choices的值?
不行哦!Django的choices参数要求必须是可迭代的序列(比如列表、元组),序列里的每个元素是一个二元组(存储值, 显示文本)。直接传字典的话会触发错误,因为字典不符合这个格式。
不过你可以像上面那样,先定义字典,再把它转换成符合要求的列表元组格式,这样既保留了字典键值查找的便捷性,又能满足Django对choices的格式要求。
内容的提问来源于stack exchange,提问作者user2125853
相关产品推荐
相关产品推荐

