目录
choices 参数
choices 参数的用法
choices 参数用法总结
choices 参数其他字段用法
choices 参数
在将 choices 参数之间, 我们先来回顾一下 Django ORM 创建表类中字段如何创建的把, 是不是下面这样
- # 举例这是一张用户基本信息表
- class UserInfo(models.Model):
- username = CharField(max_length=32)
- age = IntegerField() # 整型字段不要传 max_length 参数哦 ---- 特别注意
- gender = CharField(max_length=2)# 用户性别
通过上面的 userinfo 表, 我们是否可以想一下, 在用户性别字段中, 人类的性别好像只有两种表示方式, 男 / 女, 那这样, 我们如果有 100 万条用户信息, 而这 100 万条用户的性别就这么巧有 90 万都是女.
这个时候, 就造成了问题, 既然我们这个字段的描述信息, 只需要两种描述就能完成这个用户字段在性别的描述, 我们为什么不想一种方便简洁的形式去描述每一个用户的性别呢?
这个时候, 不知道还是否记得, 有没有什么数据类型是只有两种表现形式的呢?(布尔值?), 没错就是布尔值, 布尔值大家是否还记得(0:false / 1:True).
这是一种方法, 但是在这种情况下, 很遗憾我们不需要用布尔值这种方式, 这就引出了 choices 参数
我们依然是用数字来记录 gender 这个用户性别字段的描述, 大家学过数据库就知道, 能用整型存储的信息, 为什么要用字符型呢? 很明显, 是因为整型比字符型占的空间小. 注意: 并不是所有的这种仅仅用几个描述就能完成队大量数据的描述, 都去用数字的, 此处只是用 gender 字段为例!!
choices 参数的概念: 它是一种以列表 / 元组的型式, 里面嵌套着少数几个小元组的方式, 表示一种对应关系
choices 参数的用法
针对上述的用户信息表我们左如下的修改: 将用户性别用整型去记录
- # 创建 userinfo 表
- class UserInfo(models.Model):
- username = models.CharField(max_length=32)
- age = models.IntegerField()
- # 在此处我们用到 choices 参数
- # 先定义一个 chocies 参数的对应关系 / 其是就相当于是代表数字的说明与介绍
- choices = [
- (1, 'male'),
- (2, 'female'),
- ]
- # 以上定义的 choices 列表就是下面 gender 字段的 choices 参数对应的一个对应关系, 此处 choices 这个列表, 也可以写成元组的形式, 根据个人爱好
- # 在我们将性别字设置成 IntegerField 类对象的时候, 将它的 choices 参数设置为我们上面定义的 choices 列表
- gender = models.IntegerField(max_length=2,choices = choices)
问题 1: 如果我们向这个表中的 gender 字段存的值在我们定义的 choices 列表中会怎么样呢?
问题 2: 如果我们向这个表中的 gender 字段存的值不在我们定义的 choices 列表中会怎么样呢?
- # 向表中插入几条数据
- models.UserInfo.objects.create(username='xucheng',age=18,gender=1)
- models.UserInfo.objects.create(username='xichen',age=18,gender=2)
- models.UserInfo.objects.create(username='xichen',age=18,gender=3)
总结: 如果存的数字是 choices 列表中的数字可以存进 userinfo 表
? 存的数字不在 choices 列表中对应关系中, 也可以存
- # 现在我们来查一下这张表中用户对应的 gender 字段的值.
- user_obj_list = models.UserInfo.objects.all()
- for user_obj in user_obj_list:
- print(f'{user_obj.username}---{user_obj.age}---{user_obj.gender}')
问题: 为什么我上面都用了 choices 对应关系, 为社么查询这个字段还是数字?? 下图解释
choices 参数用法总结
在定义 choices 这个对应关系的时候, 可以用列表套元组, 可以用字典套元组, 随意, 看自己心情
自定义的这个对应关系的变量名 (choices 可以换别的) 看你心情
在往表中存数据时, 不管是不是对应关系中的内容, 都可以往表中存
在查询使用 choces 参数的这个字段时, 想要查询这个字段的值必须用 get_字段名_display()才能获取到正确的对应内容
固定句式 数据对象. get_字段名_display() 当没有对应关系的时候 该句式获取到的还是数字
choices 参数其他字段用法
- record_choices = (('checked', "已签到"),
- ('vacate', "请假"),
- ('late', "迟到"),
- ('noshow', "缺勤"),
- ('leave_early', "早退"),
- )
- record = models.CharField("上课纪录", choices=record_choices, default="checked",
- score_choices = ((100, 'A+'),
- (90, 'A'),
- (85, 'B+'),
- (80, 'B'),
- (70, 'B-'),
- (60, 'C+'),
- (50, 'C'),
- (40, 'C-'),
- (0, 'D'),
- (-1, 'N/A'),
- (-100, 'COPY'),
- (-1000, 'FAIL'),
- )
- score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
来源: http://www.bubuko.com/infodetail-3262159.html