Django | ORM choices参数详解
choices参数(数据库字段设计)
# 在数据库字段设计阶段,只要某个字段的可能性是可以列举完全的,那么一般情况下都会采用choices参数
# 什么是可以列举完全的呢?
答 :就是一个数据的结果就是定数,
比如:数据的结果为性别(男/女)
数据的结果为学历(小学,高中,大学,研究生,博士,等等)
数据的结果为是否结婚(已婚/未婚).....
# 像这样的数据,都是可以列举完全的,那么这种数据字段,一般采用choices参数
Django模型中的字段有个choices属性,这个属性可以提供被选数据,choices的参数是一个元组,它里面也是元组构成,第一个参数是choices的可选参数,第二个是对这个参数的说明。如果一个字段设置了这个属性,在模版中如果我要显示这个字段,那么django模版系统就会将它默认解析为一个下拉菜单,这样对于一个静态的下拉菜单式很方便的.下面我们来看对这个参数的具体使用
示例演示:
class User(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
gender_choices = (
(1,'男'), # 使用int类型
(2,'女'),
(3,'其他')
)
# 先列举所有的对应关系,元组的形式,第一个参数相当于变量名,第二个参数相当于变量值,可通过变量名找到对应的变量值。
gender = models.IntegerField(choices=gender_choices)
# 元组内第一个元组的第一个元素是什么类型这里就要定义什么类型,括号内填写choices参数,参数的值为定义好的对应关系
"""
该gender字段存的还是数字 但是如果存的数字在上面元祖列举的范围之内
那么可以非常轻松的获取到数字对应的真正的内容
"""
score_choices = (
('A','优秀'), # 使用字符类型
('B','良好'),
('C','及格'),
('D','差')
)
score = models.CharField(max_length=32,choices=score_choices)
研究:
1.gender字段存的数字不在上述元祖列举的范围内容
2.如果在 如何获取对应的中文信息
# 存
models.User.objects.create(username='jack',age=19,gender=1,score='A')
models.User.objects.create(username='tom',age=20,gender=2,score='B')
models.User.objects.create(username='kevin',age=31,gender=3,score='C')
# 验证没有创建对应关系的值是否可以存储进出
models.User.objects.create(username='gary',age=25,gender=4,score='D')
models.User.objects.create(username='gary',age=25,gender=5,score='E')
# 取:
user_obj = models.User.objects.filter(pk=1).first()
print(user_obj.gender)
print(user_obj.get_gender_display()) #
# 只要是choices参数的字段 如果你想要获取对应信息 固定写法 get_字段名_display()
res = models.User.objects.filter(pk=4).first()
print(res.gender)
print(res.get_gender_display())
# 如果没有对应关系 那么字段是什么还是展示什么
res1 = models.User.objects.filter(pk=5).first()
print(res1.score)
print(res1.get_score_display())
# 如果没有对应关系 那么字段是什么还是展示什么