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())
    # 如果没有对应关系 那么字段是什么还是展示什么

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django框架的ORM(Object-Relational Mapping)是一种将对象模型与关系数据库模型进行映射的技术。其目的是让开发者使用面向对象的方式来操作数据库,而不必直接使用SQL语句。 DjangoORM实现了以下功能: 1. 定义模型:使用Django定义模型的方式非常简单,只需要创建一个继承自`django.db.models.Model`的类,并定义它的属性即可。 2. 数据库迁移:当你修改了模型之后,Django会自动帮你生成数据库迁移文件,这些文件可以在数据库中创建或修改表结构。 3. 数据库查询:使用Django ORM可以进行复杂的数据库查询,包括过滤、排序、分组等操作。 4. 数据库操作:Django ORM提供了对数据库的增删改查操作,可以方便地完成对数据的操作。 下面是一个使用Django ORM的例子: ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE) published_date = models.DateField() ``` 在上面的例子中,我们定义了两个模型:`Author`和`Book`。`Author`模型有`name`和`email`两个属性,`Book`模型有`title`、`author`和`published_date`三个属性。其中,`author`属性是一个外键,它与`Author`模型建立了关联关系。 通过Django ORM,我们可以进行如下操作: 1. 创建模型表结构 ```python python manage.py makemigrations python manage.py migrate ``` 2. 添加数据 ```python author1 = Author(name='John', email='john@example.com') author1.save() book1 = Book(title='Django for Beginners', author=author1, published_date='2020-01-01') book1.save() ``` 3. 查询数据 ```python # 获取所有的作者 authors = Author.objects.all() # 获取所有的书籍 books = Book.objects.all() # 获取指定作者的所有书籍 author = Author.objects.get(name='John') books = Book.objects.filter(author=author) # 按照发布日期倒序排序 books = Book.objects.order_by('-published_date') ``` 4. 修改数据 ```python book = Book.objects.get(title='Django for Beginners') book.title = 'Django for Experts' book.save() ``` 5. 删除数据 ```python book = Book.objects.get(title='Django for Experts') book.delete() author = Author.objects.get(name='John') author.delete() ``` 总之,Django ORM可以让我们更加方便地操作数据库,提高开发效率。同时,它也具有良好的可扩展性和可维护性,可以应对各种复杂的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值