示例:
file : bookstore/models.py
from django.db import modele
class Book(models.Model):
title = models.CharField(“书名”, max_length=50, default=‘’)
price = models.DecimalField(“定价”, max_digits=7, decimal_places=2, default=0.0)
info = models.CharField(“信息”, max_length=100, default=‘’)
class Meta:
db_table = ‘book’ # 可改变当前模型类对应的表名
迁移后:
表名变成了book
练习:
class Book(models.Model):
title = models.CharField(“书名”, max_length=50, default=‘’, unique=True)
pub = models.CharField(“出版社”, max_length=100, default=‘’, null=False)
price = models.DecimalField(“价格”, max_digits=7, decimal_places=2)
marker_price = models.DecimalField(“零售价”, max_digits=7, decimal_places=2, default=0.0)
class Meta:
db_table = ‘book’ # 可改变当前模型类对应的表名
class Author(models.Model):
name = models.CharField(“姓名”, max_length=11, null=False)
age = models.IntegerField(“年龄”, default=“1”)
email = models.EmailField(“邮箱”, null=True)
class Meta:
db_table = ‘author’ # 可改变当前模型类对应的表名
======================================================================
- 问题1:当执行
python3 manage.py makemigrations
出现如下迁移错误时的处理方法
- 数据库的迁移文件混乱的解决方法
-
数据库中django_migrations表记录了migrate的’全过程’,项目个应用中的migrate文件与之对应,否则migrate会报错。
-
解决方案:
-
删除所有migrations里所有的000?XXXX.py(__init_.py除外)
-
删除数据库
drop database mywebdb;
- 重新创建数据库
create database mywebdb default charset…;
- 重新生成migrations里面所有的000?_XXXX.py
python3 manage.py makemigrations
- 重新更新数据库
python3 manage.py migrate
=========================================================================
Django提供了一个交互式的操作项目叫Django Shell,它能够在交互模式用项目工程的代码执行相应的操作
利用Django Shell可以代替编写view的代码来进行直接操作
注意:项目代码发生变化时,重新进入Django shell
启动方式:
python3 manage.py shell
==================================================================
基本操作包括增删改查操作,即(CURD操作)
CURD是指在计算处理时的增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)
ORM CURD核心 → 模型类.管理器对象
每个继承自models.Model的模型类,都会有一个objects对象被同样继承下来。这个对象叫管理器对象。
数据库的增删改查可以通过模型的管理器实现。
class MyModel(models.Model):
···
MyModel.objects.create(…) # objects 是管理器对象
Django ORM使用一种直观的方式把数据库表中的数据表示成Python对象,创建数据中每一条记录就是创建一个数据对象
6.2.1. 方案1
MyModel.objects.create(属性1=值1,属性2=值2…)
成功:返回创建好的实体对象
失败:抛出异常
测试:
6.2.2. 方案2
创建MyModel实例对象,并调用save()进行保存
obj = MyModel(属性=值,属性=值…)
obj.属性 = 值
obj.save()
测试:
6.2.3. 练习
结果:
6.3.1. 查询简介
-
数据库的查询需要使用管理器对象进行
-
通过MyModel.objects管理器方法调用查询方法
| 方法 | 说明 |
| — | — |
| all() | 查询全部记录,返回QuerySet查询对象 |
| get() | 查询符合条件的单一记录 |
| filter() | 查询符合条件的多条记录 |
| exclude() | 查询符合条件之外的全部记录 |
| ··· | |
6.3.2. all()方法
用法:MyModel.objects.all()
作用:查询MyModel实体中所有的数据
等同于select * from table
返回值:QuerySet容器对象,内部存放MyModel实例
from bookstore.models import Book
books = Book.objects.all()
for book in books:
print(“书名”, book.title, “出版社”, book.pub)
6.3.3. 查询技巧
可以在模型类中定义__str__方法,自定义QuerySet中的输出格式
例如 在Book模型类下定义如下:
def str(self):
return “%s_%s_%s_%s”%(self.title,self.price,self.pub,self.market_price)
则在Django shell中可得如下显示输出
6.3.4. values(…)
用法:
MyModel.objects.values(‘列1’,‘列2’…)
作用:查询部分列的数据并返回,等同于select 列1,列2 from xxx
返回值:QuerySet
返回查看结果容器,容器内存字典,每个字典代表一条数据
格式为:
{
“列1”:值1,
“列2”:值2
}
6.3.5. values_list(…)
用法:
MyModel.objects.values_list(‘列1’,‘列2’…)
作用:返回元组形式的查询结果,等同于select 列1,列2 from xxx
返回值:QuerySet容器对象,内部存放元组
会将查询出来的数据封装到元组中,在封装到查询集合QuerySet中
6.3.6. order_by()
用法:
MyModel.objects.order_by(‘-列’,‘列’)
作用:
与all()方法不同,它会用SQL语句的ORDER BY子句对查询结果进行根据某个字段选择性的排序
说明:
- 默认是按照升序排序,降序排序则需要在列前面增加
'-'
表示
- 方法之间支持链路调用
6.3.7. query
可以使用QuerySet.query
查询原始SQL语句
6.3.8. 练习1
6.3.9. filter(条件)
语法:
MyModel.objects.filter(属性1=值1,属性2=值2…)
作用:返回包含此条件的全部的数数据集
返回值:QuerySet容器对象,内部存放MyModel实例
说明:当多个属性在一起时,为"与"关系,即当
样例:
查询书中出版社为"清华大学出版社"的图书
from bookstore.models import Book
books = Book.objects.filter(pub = “清华大学出版社”)
for book in books:
print(“书名:”, book.title)
查询Author实体中name为王老师并且age是28岁的
from bookstore.models import Author
author = Author.objects.filter(name=‘王老师’, age=28)
6.3.10. exclude(条件)
语法:
MyModel.objects.exclude(条件)
作用:返回不包含此条件的全部的数据集
示例:
查询清华大学出版社,定价等于50以外的全部图书
from bookstore.models import Book
books = Book.objects.exclude(pub=“清华大学出版社”, price=50)
for book in books:
print(book)
6.3.11. get(条件)
语法:
MyModel.objects.get(条件)
作用:返回满足该条件的唯一一条数据
说明:该方法只能返回一条数据,查询结果多余一条数据则抛出Model.MultipleObjectsReturned
异常。查询结果如果没有数据则抛出Model.DoecNotExist
异常。
6.3.12. 查询谓词
思考:如何做非等值的过滤查询,即 where id > 1
尝试:Book.objects.filter(id > 1) ?
解决方案:查询谓词
定义:做更灵活的条件查询时需要使用查询谓词
说明:每一个查询谓词是一个独立的查询功能
| 查询谓词 | 含义 | 示例 | 等价SQL |
| — | — | — | — |
| __exact | 等值查询 | Author.objects.filter(id__exact=1) | select * from author where id = 1 |
| __contains | 包含指定值 | Author.objects.filter(name__contains=‘w’) | select * from author where name like ‘%w%’ |
| __startswith | 以XXX开始 | Author.objects.filter(name__startswith=‘w’) | select * from author where name like ‘w%’ |
| __endswith | 以XXX结束 | Author.objects.filter(name__endswith=‘w’) | select * from author where name like ‘%w’ |
| __gt | 大于指定值 | Author.objects.filter(age__gt=50) | select * from author where age > 50 |
| __gte | 大于等于指定值 | Author.objects.filter(age__gte=30) | select * from author where age >= 50 |
| __lt | 小于指定值 | Author.objects.filter(age__lt=30) | select * from author where age < 50 |
| __lte | 大于等于指定值 | Author.objects.filter(age__lte=30) | select * from author where age <= 50 |
| __in | 查询数据是否在指定范围内 | Author.objects.filter(country__in=[‘中国’,‘日本’,‘韩国’]) | select * from author where country in (‘中国’,‘日本’,‘韩国’) |
| __range | 查找数据是否在指定区间范围内 | Author.objects.filter(age__range=(30,50)) | select * from author where age between 35 and 50 |
官方文档:https://docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups
6.4.1. 单个数据
修改单个实体的某些字段值的步骤:
-
查:通过
get()
得到要修改的实体对象 -
改:通过
对象.属性
的方式修改数据 -
存:通过
对象.save()
保存数据
6.4.2. 批量更新
直接调用QuerySet的update(属性=值)实现批量修改,返回更新成功的条数
示例:
将id大于3的所有图书价格定为0元
books = Book.objects.filter(id__gt=3)
books.update(price=0)
将所有书的零售价定为100元
books = Book.objects.all()
books.update(market_price=100)
6.4.3. 练习2
-
列表界面
-
更新界面
-
视图函数
-
路由
6.5.1. 干个数据
步骤:
-
查找查询结果对应的一个数据对象
-
调用这个数据对象的
delete()
方法实现删除
try:
auth = Author.objects.get(id=1)
auth.delete()
except:
print(删除失败)
6.5.2. 批量数据
步骤:
-
查找查询结果集中满足条件的全部QuerySet查询集合对象
-
调用查询集合对象的delete()方法实现删除
删除全部作者中,年龄大于65的全部信息
auths = Author.objects.filter(age__gt=65)
auths.delete()
6.5.3. 伪删除
- 通常不会轻易在业务中把数据真正删掉,取而代之的是做伪删除。
即在表中添加一个布尔型字段(is_active),默认是True;执行删除时,将欲删除数据的is_active字段置为False
- 注意:用伪删除时,确保显示数据的地方,均加了is_active = True的过滤查询
6.6.1. F对象
一个F对象代表数据库中某条记录的字段的信息
作用:
-
通常是对数据库的字段值在不获取的情况下进行操作
-
用于类属性(字段)之间的比较
语法:
from django.db.models import F
F(‘列名’)
示例1:更新Book实例中所有的零售价涨10元
Book.objects.all().update(market_price=F(‘market_price’)+10)
‘UPDATE bookstore_book
SET market_price
= (bookstore_book
.market_price
+ 10)’
以上代码好于如下代码
books = Book.objects.all()
for book in books:
book.market_price = book.market_price + 10
book.save()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-wYllgtf7-1711606919621)]
[外链图片转存中…(img-tXEsIzki-1711606919622)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-DUgsAUzG-1711606919622)]
最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。