欢迎来到Cecilia陈的博客

孤独,是人一生最好的修行。

14 ORM 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 参数用法总结

  1. 在定义choices这个对应关系的时候,可以用列表套元组,可以用字典套元组,随意,看自己心情
  2. 自定义的这个对应关系的变量名(choices可以换别的)看你心情
  3. 在往表中存数据时,不管是不是对应关系中的内容,都可以往表中存
  4. 在查询使用choces参数的这个字段时,想要查询这个字段的值必须用get_字段名_display()才能获取到正确的对应内容
  5. 固定句式 数据对象.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)
    
posted @ 2019-10-28 20:31  Cecilia陈  阅读(625)  评论(0编辑  收藏  举报