python学习第6天
python学习第6天
python学习第6天---django框架---模型类及数据库操作
目录
- 1、字段与选项
- 2、查询函数
- 、查询集
- 4、模型类之间的关系
- 4.1、对应关系
- 4.2、关联查询
- 5、模型管理器类
- 5.1、简介
- 5.2、自定义模型管理器类
- 5.、应用场景
- 5.4、实例
- 6、元选项
- ***后记*** :
内容
1、字段与选项
django中字段属性对应数据库表中字段属性,参数对应表中字段约束。
-
格式:
name(字段名称) = models.Type(param, *ar, **keywords)
- name:字段名称
- Type: 为字段类型
-
- param:参数,即为约束条件
-
常用字段属性和参数表格说明1-1:
name | param | 默认值 | 说明 |
---|---|---|---|
BooleanField | False | 布尔字段,值为True或False | |
CharField | max_length= | ‘’ | 字符串,参数max_length表示最大字符个数 |
TextField | 大文本字段,一般超过4000个字符时使用 | ||
IntegerField | max_length | 整数字段 | |
DecimalField | max_digits=,decimal_places= | 十进制定点浮点数,max_digits为总位数,decimal_places为小数点后位数 | |
DateField | auto_now=,auto_now_add | False | 日期字段,auto_now表示自动添加当前时间戳,auto_now_add表示修改时更新为当前时间戳,2个字段互斥,不能同时使用 |
- 常用字段属性和参数表格说明1-2:
name | default | description |
---|---|---|
default | False | 默认值 |
db_index | False | 索引 |
db_column | 设置字段名称与表字段对应 | |
null | False | 空值,数据库空值 |
blank | False | 空,用于表单提交验证 |
2、查询函数
- 常用查询函数表格2-1:
函数名 | 功能 | 返回值 | 说明 |
---|---|---|---|
get | 返回表中满足条件的一个且只能有一条数据 | 一个模型类对象 | 1)查到多条数据,抛MultipleObjectsReturned异常 2)查询不到数据,抛DoesotExist异常 |
all | 返回表中所有数据 | QuerySet结果集 | 查询集 |
filter | 返回表中满足条件的数据 | QuerySet | 参数为查询条件 |
exclude | 不满足条件的数据 | QuerySet | 参数查询条件 |
order_by | 对结果进行排序 | QuerySet | 参数写根据那些字段排序 |
-
filter:
-
条件格式: 模型类属性名__条件名=值
-
示例:查询图书评论为4的图书信息
-
代码2-1:
In [5]: books = filter(comment_volume=4)In [6]: print(books)<QuerySet [<Book: Book object (1)>]>
-
-
条件类型
- 判等:exact,默认可以省略
- 模糊查询:
-
contains:是否包含某个值
-
示例:查询书名包含’传’的图书
-
代码2-2:
In []: books1 = filter(name__contains= 传 )In [5]: for book in books1:...: print(book)...: 射雕英雄传
-
-
startswith:是否以…开头
-
endswith:是否以…结尾
-
- 空查询:isnull
- 范围查询:in
-
示例:查询id为1或者的图书信息
-
代码2-:
In [2]: books2 = filter(id__in=[1,])In []: for book in books2:...: print(book)...: 射雕英雄传笑傲江湖
-
-
-
order_by
-
默认升序
-
示例:查询所有图书信息,按照ID从小到大排序
-
代码:
In [2]: books1 = all().order_by( id )In []: for book in books1:...: print(book)...: 1 射雕英雄传2 天龙八部 笑傲江湖4 雪山飞狐5 书剑恩仇录
-
-
降序:既在排序字段前面加上‘-’
-
示例:查询所有图书信息,按照ID从小到大排序
-
代码:
In [2]: books1 = all().order_by( -id )In []: for book in books1:...: print(book)...: 5 书剑恩仇录4 雪山飞狐 笑傲江湖2 天龙八部1 射雕英雄传
-
-
-
F对象:用于类属性直接的比较
-
示例:查询阅读量大于评论量的图书
-
代码
In [6]: books2 = filter(reading_volume__gt=F( comment_volume ))In [7]: for book in books1:...: print( %s\t%s\t%s %(, book.reading_volume, bookment_volume))...: 雪山飞狐 58 24
-
-
Q对象:用于查询时条件之间的逻辑关系
-
示例:查询id大于2且评论量大于0的图书
-
代码:
In [6]: books2 = filter(Q(id__gt=2)&Q(reading_volume__gt=0))In [7]: for book in books2:...: print( %s\t%s\t%s %(book.id, , book.reading_volume))...: 4 雪山飞狐 58
-
-
聚合函数:查询结果为字典类型
-
max:最大值
-
示例:查询评论量最大的图书
-
代码:
In [8]: book = aggregate(Max( comment_volume ))In [11]: print(book){ comment_volume__max : 80}
-
-
min:最小值
-
avg:平均值
-
sum:求和
-
count:数量
-
、查询集
-
查询集特性:
- 惰性查询:只有在实际使用查询集中数据的时候,才会对数据库进行查询
- 缓存:当使用的是同一个查询集时,只有第一使用数据集中数据的时候,会进行数据库查询。当再次使用的时候,不在去数据库查询,直接使用缓存结果。
-
限制查询集:
可以对一个查询集进行取下标或者切片。进行切片操作会产生一个新的查询集,下标不允许为负数。
4、模型类之间的关系
&emps; 同表之间对应关系一样,模型类之间也有三种对应关系:
- 一对一关系
-
- 关系建立:
models.OneToOneField(选项)
设置任一模型类中
- 关系建立:
-
- 一对多关系
- 关系建立:
models.ForeignKey(选项)
设置在多类中
- 关系建立:
- 多对多关系
- 关系建立:
models.ManyToManyField(选项)
设置在任一模型类中
- 关系建立:
-
查询规则图示4.2-1:
-
1:查询图书id为1的所有英雄信息
-
代码:
In [1]: heros1 = filter(book_id=1)In [14]: for hero in heros1:...: print( %s\t%s\t\%s %(hero.id, , hero.remark))...: 1 郭靖 \降龙十八掌2 黄蓉 \棍法 黄药师 \弹指神通4 欧阳锋 \蛤蟆功5 梅超风 \九阴白骨爪
-
-
2:查询英雄id为1的所属图书信息
-
代码:
In [18]: book1 = get(hero__id=1)In [19]: print( %s\t%s %(book1.id, ))1 射雕英雄传
-
-
5、模型管理器类
,其中objects为django框架自动生成的管理器对象,通过这个管理器可以实现对数据的查询。
- 自定义管理器类需要继承models.Manager类
- 在在具体的模型类中定义一个自定义模型管理器对象
- 改变查询的结果集
- 添加额外的方法
- 需求1:我们想要查询所有图书室,只显示在售图书。
- 需求2:我们想要一个api完成数据库中图书信息的添加
- 代码5.4-1:
from django.db import models# Create your models here.
class BookManager(models.Manager):图书管理器类# 1、改变查询结果集def all(self): 自定义all方法 books = super().all()books.filter(isDelete=False)return books# 2、封装函数:操作模型类对应的数据表def create_book(self, name): 向book表添加新图书 # book = Book()model_class = _ = namemodel_class.save()return model_classclass Book(models.Model):图书模型类# 图书名称name = models.CharField(max_length=20)# 出版日期publishing_date = models.DateField(auto_now_add=True)# 阅读量reading_volume = models.IntegerField(default=0)# 评论量comment_volume = models.IntegerField(default=0)# 删除标记isDelete = models.BooleanField(default=False)# 图书管理器对象objects = BookManager()class Meta:db_table = book_book # def __str__(self):# return str(self.id) \t Hero(models.Model):图书中英雄模型类# 英雄姓名name = models.CharField(max_length=20)# 性别gender = models.BooleanField(default=False)# 备注remark = models.CharField(max_length=2)# 删除标记isDelete = models.BooleanField(default=False)# 关联关系,一对多:多book = models.ForeignKey(Book, models.CASCADE)class Meta:db_table = book_hero class Area(models.Model):地区模型类# 地区名称name = models.CharField(max_length=20)# 地区自关联,一对多parent = models.ForeignKey( self , models.CASCADE, null=True, blank=True)class Meta:db_table = book_area
-
测试
create_book(‘神雕侠侣’)
all()查询结果:In [4]: book1 = create_book( 神雕侠侣 )In [5]: books = all()In [6]: for book in books:...: print( %s\t%s\t%s %(book.id, , book.isDelete))...: 1 射雕英雄传 False2 天龙八部 False 笑傲江湖 False4 雪山飞狐 False5 书剑恩仇录 True6 神雕侠侣 False
6、元选项
需要在模型类中定义一个元类Meta,在里面定义类属性db_table就可以指定表名,默认表名为应用名称_模型名。
- 常用元选项:指定表名,源代码见上面5.4-1,指定表名,然后数据迁移之后,表名图示6-1:
后记 :
本项目为参考某音python系列视频。上面为自己参考写的学习笔记,持续更新。欢迎交流,本人QQ:806797785
- 原视频地址:=.788.b_765f7570696e666f.1
- 笔记项目源代码地址:
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 7 条评论) |
本站网友 福田公司 | 22分钟前 发表 |
实例 需求1:我们想要查询所有图书室,只显示在售图书 | |
本站网友 爽身粉什么牌子好 | 19分钟前 发表 |
本站网友 厦门自助餐 | 1分钟前 发表 |
为字段类型 param | |
本站网友 手相看病 | 6分钟前 发表 |
print(book)... | |
本站网友 经期减肥 | 26分钟前 发表 |
进行切片操作会产生一个新的查询集,下标不允许为负数 | |
本站网友 不断地 | 28分钟前 发表 |
print(book)... |