python学习第6天---django框架---模型类及数据库操作
目录
文章目录
内容
1、字段与选项
django中字段属性对应数据库表中字段属性,参数对应表中字段约束。
-
格式:
name(字段名称) = models.Type(param, *argv, **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)查询不到数据,抛DoesNotExist异常 |
all | 返回表中所有数据 | QuerySet结果集 | 查询集 |
filter | 返回表中满足条件的数据 | QuerySet | 参数为查询条件 |
exclude | 不满足条件的数据 | QuerySet | 参数查询条件 |
order_by | 对结果进行排序 | QuerySet | 参数写根据那些字段排序 |
-
filter:
-
条件格式: 模型类属性名__条件名=值
-
示例:查询图书评论为34的图书信息
-
代码2-1:
In [5]: books = Book.objects.filter(comment_volume=34) In [6]: print(books) <QuerySet [<Book: Book object (1)>]>
-
-
条件类型
- 判等:exact,默认可以省略
- 模糊查询:
-
contains:是否包含某个值
-
示例:查询书名包含’传’的图书
-
代码2-2:
In [3]: books1 = Book.objects.filter(name__contains='传') In [5]: for book in books1: ...: print(book) ...: 射雕英雄传
-
-
startswith:是否以…开头
-
endswith:是否以…结尾
-
- 空查询:isnull
- 范围查询:in
-
示例:查询id为1或者3的图书信息
-
代码2-3:
In [2]: books2 = Book.objects.filter(id__in=[1,3]) In [3]: for book in books2: ...: print(book) ...: 射雕英雄传 笑傲江湖
-
-
-
order_by
-
默认升序
-
示例:查询所有图书信息,按照ID从小到大排序
-
代码:
In [2]: books1 = Book.objects.all().order_by('id') In [3]: for book in books1: ...: print(book) ...: 1 射雕英雄传 2 天龙八部 3 笑傲江湖 4 雪山飞狐 5 书剑恩仇录
-
-
降序:既在排序字段前面加上‘-’
-
示例:查询所有图书信息,按照ID从小到大排序
-
代码:
In [2]: books1 = Book.objects.all().order_by('-id') In [3]: for book in books1: ...: print(book) ...: 5 书剑恩仇录 4 雪山飞狐 3 笑傲江湖 2 天龙八部 1 射雕英雄传
-
-
-
F对象:用于类属性直接的比较
-
示例:查询阅读量大于评论量的图书
-
代码
In [6]: books2 = Book.objects.filter(reading_volume__gt=F('comment_volume')) In [7]: for book in books1: ...: print('%s\t%s\t%s' %(book.name, book.reading_volume, book.comment_volume)) ...: 雪山飞狐 58 24
-
-
Q对象:用于查询时条件之间的逻辑关系
-
示例:查询id大于2且评论量大于30的图书
-
代码:
In [6]: books2 = Book.objects.filter(Q(id__gt=2)&Q(reading_volume__gt=30)) In [7]: for book in books2: ...: print('%s\t%s\t%s' %(book.id, book.name, book.reading_volume)) ...: 4 雪山飞狐 58
-
-
聚合函数:查询结果为字典类型
-
max:最大值
-
示例:查询评论量最大的图书
-
代码:
In [8]: book3 = Book.objects.aggregate(Max('comment_volume')) In [11]: print(book3) {'comment_volume__max': 80}
-
-
min:最小值
-
avg:平均值
-
sum:求和
-
count:数量
-
3、查询集
-
查询集特性:
- 惰性查询:只有在实际使用查询集中数据的时候,才会对数据库进行查询
- 缓存:当使用的是同一个查询集时,只有第一使用数据集中数据的时候,会进行数据库查询。当再次使用的时候,不在去数据库查询,直接使用缓存结果。
-
限制查询集:
可以对一个查询集进行取下标或者切片。进行切片操作会产生一个新的查询集,下标不允许为负数。
4、模型类之间的关系
4.1、对应关系
&emps; 同表之间对应关系一样,模型类之间也有三种对应关系:
- 一对一关系
-
- 关系建立:
models.OneToOneField(选项)
设置任一模型类中
- 关系建立:
-
- 一对多关系
- 关系建立:
models.ForeignKey(选项)
设置在多类中
- 关系建立:
- 多对多关系
- 关系建立:
models.ManyToManyField(选项)
设置在任一模型类中
- 关系建立:
4.2、关联查询
-
查询规则图示4.2-1:
-
1:查询图书id为1的所有英雄信息
-
代码:
In [13]: heros1 = Hero.objects.filter(book_id=1) In [14]: for hero in heros1: ...: print('%s\t%s\t\%s' %(hero.id, hero.name, hero.remark)) ...: 1 郭靖 \降龙十八掌 2 黄蓉 \打狗棍法 3 黄药师 \弹指神通 4 欧阳锋 \蛤蟆功 5 梅超风 \九阴白骨爪
-
-
2:查询英雄id为1的所属图书信息
-
代码:
In [18]: book1 = Book.objects.get(hero__id=1) In [19]: print('%s\t%s' %(book1.id, book1.name)) 1 射雕英雄传
-
-
5、模型管理器类
5.1、简介
Book.objects,其中objects为django框架自动生成的管理器对象,通过这个管理器可以实现对数据的查询。
5.2、自定义模型管理器类
- 自定义管理器类需要继承models.Manager类
- 在在具体的模型类中定义一个自定义模型管理器对象
5.3、应用场景
- 改变查询的结果集
- 添加额外的方法
5.4、实例
- 需求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 = self.model
model_class.name = name
model_class.save()
return model_class
class 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' + self.name
class Hero(models.Model):
"""图书中英雄模型类"""
# 英雄姓名
name = models.CharField(max_length=20)
# 性别
gender = models.BooleanField(default=False)
# 备注
remark = models.CharField(max_length=32)
# 删除标记
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'
-
测试
Book.objects.create_book(‘神雕侠侣’)
Book.objects.all()查询结果:In [4]: book1 = Book.objects.create_book('神雕侠侣') In [5]: books = Book.objects.all() In [6]: for book in books: ...: print('%s\t%s\t%s' %(book.id, book.name, book.isDelete)) ...: 1 射雕英雄传 False 2 天龙八部 False 3 笑傲江湖 False 4 雪山飞狐 False 5 书剑恩仇录 True 6 神雕侠侣 False
6、元选项
需要在模型类中定义一个元类Meta,在里面定义类属性db_table就可以指定表名,默认表名为应用名称_模型名。
- 常用元选项:指定表名,源代码见上面5.4-1,指定表名,然后数据迁移之后,表名图示6-1:
后记 :
本项目为参考某音python系列视频。上面为自己参考写的学习笔记,持续更新。欢迎交流,本人QQ:806797785