第六单元 初识ORM

6.1 模型字段

6.1.1 模型类字段类型及特殊属性

语法:
属性=models.字段类型(选项)
字段类型

类型解释
BooleanField布尔字段,值为True或False
CharField字符串,参数max_length表示最大字符个
DateField日期
DatetimeField日期和时间
DecimalField参数max_digits表示总位数, 参数decimal_places表示小数位数
FloatField浮点数
IntegerField整数

6.2 字段属性

6.2.1 字段通用属性

选项说明
null如果值为True,表示为允许为空,默认值值False
blank如果为True,则该字段允许为空白,默认值为False
choices一个二元组的列表或元组,元组第一个值为真正在数据中存储的值,第二个值为该选项的描述
db_column用来数据库中的该字段表示的名称,如果未指定,那么将会使用属性的名称
db_index若值为True, 则在表中会为此字段创建索引,默认值是False
default默认该字段
primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
upique如果为True, 这个字段在表中必须有唯一值,默认值是False. 注意ManyToManyFieldOneToOneFieldFileField字段不可以使用该属性
verbose_name对于字段的一个可读性更高的名称

注意:null是数据库范畴的概念,blank是表单验证范畴的

6.3 模型类元选项

6.3.1 模型元选项

在模型类的Meta类中,可以提供一系列的元选项,可以方便对该模型类进行属性设置或约束等

abstract
代表当前模型类为抽象基类,不会创建真正的数据表,只是为了其他模型类继承使用.

abstract = True

app_label
当模型类被定义在了其他 app 下,这个属性用来描述当前表属于哪个 app 应用

app_label = “MyApp”

db_table
当前模型类所对应的表名,未设置时,django 默认将表名与 app 名由下划线组成,作为表名
ordering
当前表中的数据存储时的排序规则,这是一个字段名的字符串,可以是一个列表或元组
verbose_name
一般设置该表展示时所用的名称,名称被自动处理为复数,字符串后加一个"s"
verbose_name_plural
verbose_name功能相同,但是不会自动在字符串后加"s"以表复数
设置表的复数名称

    # 元类
    class Meta:
        verbose_name = '书籍信息表'  # admin页面中表的名字
        # 与`verbose_name`功能相同,但是不会自动在字符串后加"`s`"以表复数
        # 设置表的复数名称
        verbose_name_plural = verbose_name  # admin页面中表的名字(复数)
        db_table = 'bookinfo'   # 在数据库中的表名

6.4 shell工具

Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境,以便可以直接在终端中执行测试python语句。

python manage.py shell

6.5 Orm 增删改查

6.5.1 查找

区别:

  • filter():过滤获取一组数据 获取到的是数组、
BookInfo.objects.filter(name='射雕英雄传')
  • get():精准的获取一个数据
BookInfo.objects.get(name='射雕英雄传')
  • all():获取一个表中的所有数据
BookInfo.objects.all()
  • count(): 查找结果的数量
BookInfo.objects.count()

6.5.2 添加

方法一:
使用 save 创建数据

book = BookInfo(
    name='python高级',
    pub_date='2022-04-27',
    read_count=222,
    comment_count=100,
)
book.save() # 通过实例的 save 函数进行该数据的保存
)

方法二
使用 create 创建数据

BookInfo.objects.create(
    name='python',
    pub_date='2022-08-05',
    read_count=500,
    comment_count=200,
)

6.5.3 修改

方式一

BookInfo.objects.filter(name='python').update(sale_out=True)

方法二

book = BookInfo.objects.get(name='python高级')  # 获取对象
book.read_count = 2  # 修改属性值
book.save()  # 保存生效

6.5.4 删除

方式一

BookInfo.objects.filter(name="python").delete()

方法二

book = BookInfo.objects.get(name="python高级")  # 获取对象
book.delete()  # 删除对象

总结

1. 基本查询

属性说明
get查询单一结果
all查询多个结果
count查询结果

2.过滤查询

属性说明
filter过滤出多个结果
exclude排除掉符合条件剩下的结果
get过滤单一结果
# 过滤查询   .exclude排除满足条件的
# 查询编号不等于3的图书。
BookInfo.objects.exclude(id=3) # 排除满足条件的

from django.db.models import Q
BookInfo.objects.filter(~Q(id=3))
链式过滤条件

字段名__条件

  • contains
    大小写敏感查询
# 查询书名包含'湖'的图书
BookInfo.objects.filter(name__contains='湖')# 包含
  • icontains
    大小写不敏感的匹配查询
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__contains='部')
  • range
    在某个范围内进行查询
# 查询编号为1到6的图书
BookInfo.objects.filter(id__in=[1,6])# 范围
  • in
    查询条件是否在给定的范围内,用小括号和中括号都可以
# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1,3,5])# 范围
  • iexact
    忽略大小写的匹配
Person.objects.filter(account__iexact='root')
#匹配到的结果可能是 Root,ROot,ROOt,ROOT
  • gt gte lt lte
# gt大于  gte大于等于  lt小于   lte小于等于
BookInfo.objects.filter(id__gt=3)# 大于

3. 聚合函数

# .aggregate调用聚合函数的
from django.db.models import Count, Max, Min, Avg, Sum,Count
# 查询图书的总阅读量。
BookInfo.objects.aggregate(Sum('read_count'))

4.排序

# 查询所有书籍信息平按照阅读量排序。
BookInfo.objects.all().order_by('read_count')  # 升序
BookInfo.objects.all().order_by('-read_count')  # 降序
# 查询id小于等于3的书籍,并按照评论量升序排序
BookInfo.objects.filter(id__lte=3).order_by('comment_count')

5.ORM的Q、F查询

F 查询

属性(字段)和属性(字段)比较
字段和字段比较使用

# 查询阅读量大于等于评论量的图书。
from django.db.models import F
BookInfo.objects.filter(read_count__gte=F('comment_count'))
# 查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(read_count__gt=F('comment_count')*2)
Q 查询

多条件查询and:& 和 or:|

# 查询阅读量大于20,并且编号小于3的图书。
BookInfo.objects.filter(read_count__gt=20, id__lt=3)
BookInfo.objects.filter(read_count__gt=20).filter(id__lt=3)

from django.db.models import Q
BookInfo.objects.filter(Q(read_count__gt=20) & Q(id__lt=3))
# 查询阅读量大于20,或编号小于3的图书。
BookInfo.objects.filter(Q(read_count__gt=20) | Q(id__lt=3))
# 过滤查询   .exclude排除满足条件的
# 查询编号不等于3的图书。
BookInfo.objects.exclude(id=3) # 排除满足条件的
BookInfo.objects.filter(~Q(id=3))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值