这里写目录标题
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. 注意:ManyToManyField 、OneToOneField 与FileField 字段不可以使用该属性 |
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))