12,全网首发

  • 通过简单的配置就可以轻松更换数据库,而不需要修改代码

2.4. 缺点


  1. 对于复杂业务,使用成本较高

  2. 根据对象的操作转换成SQL语句,根据查询的结果转换成对象,在映射过程中有性能损失

2.5. 映射图


在这里插入图片描述

2.6. 模型示例


此示例为添加一个bookstore_book数据表来存放图书馆中的书目信息

  1. 添加一个bookstore的app

python3 manage.py startapp bookstore

在这里插入图片描述

  1. 注册应用app

在这里插入图片描述

  1. 添加模型类

模型类代码示例

file : bookstore/models.py

from django.db import models

class Book(models.Model):

title = models.CharField(“书名”, max_length=50, default=‘’)

price = models.DecimalField(“定价”, max_digits=7, decimal_places=2, default=0.0)

  1. 数据库迁移

迁移是Django同步对模型所做的更改(添加字段、删除模型等)到数据库模式的方式

  • 生成迁移文件 — 执行 python3 manage.py makemigrations

将应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中

  • 执行迁移脚本程序 — 执行 python3 manage.py migrate

执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步回数据库

  1. 效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、模型类

================================================================

3.1. 创建


  • 创建应用

  • 在应用下的models.py中编写模型类

from django.db import models

class 模型类名(models.Model):

字段名 = models.字段类型(字段选项)

  • 迁移同步 makemigrations & migrate

  • 任何关于表结构,务必在对应模型类上修改

例:为bookstore_book表添加一个名为info的字段varchar(100)

解决方案:

  • 模型类中添加对应类属性

  • 执行数据库迁移

在这里插入图片描述

3.2. 基础字段


  • **BooleanField() **

  • 数据库类型:tinyint(1)

  • Django类型:使用True或False来表示值

  • 在数据库中,使用1或者0来表示具体的值

  • CharField()

  • 数据库类型:varchar

  • 注意: 必须要指定max_length参数值

  • DateField()

  • 数据库类型:date

  • 作用:表示日期

  • 参数:

  • auto_now:每次保存对象时,自动设置该字段为当前时间(取值:True / False)

  • auto_now_add:当对象第一次被创建时自动设置当前时间(取值:True / False)

  • default:设置当前时间(取值:字符串格式时间,如:‘2019-6-1’)

  • 以上三个参数只能多选一

  • DateTimeField()

  • 数据库类型:datetime(6)

  • 作用:表示日期和时间

  • 参数同DateField

  • FloatField()

  • 数据库类型:double

  • Django、数据库中都是用小数表示值

  • DecimalField()

  • 数据库类型:decimal(x,y)

  • Django、数据库中都是用小数表示值

  • 参数:

  • max_digits:位数总数,包括小数点后的位数。该数值必须大于等于decimal_places

  • decimal_places:小数点后的数字量数

  • EmailField()

  • 数据库类型:varchar

  • Django、数据库中都是用字符串表示值

  • IntegerField()

  • 数据库类型:int

  • Django、数据库中都是用整数表示值

  • ImageField()

  • 数据库类型:varchar(100)

  • 作用:在数据库中为了保存图片的路径

  • Django、数据库中都是用字符串表示值

  • TextField()

  • 数据库类型:longtext

  • 作用:表示不定长的字符数据

  • 官方文档

https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-types

3.3. 创建模型类测试


在bookstore/models.py应用中,添加一个模型类

  • Author - 作者

  • name CharField 姓名 长度最大11

  • age IntegerField 年龄

  • email EmailField 邮箱

  • 代码:

class Author(models.Model):

name = models.CharField(“姓名”, max_length=11)

age = models.IntegerField(“年龄”)

email = models.EmailField(“邮箱”)

  • 迁移:

在这里插入图片描述

3.4. 字段选项


  • 字段选项,指定创建的列的额外的信息

  • 允许出现多个字段选项,多个选项之间使用,隔开

  • primary_key:如果设置为True,表示该列为主键,如果指定一个字段为逐渐,则此数据表不会创建id字段。

  • blank:设置为True时,字段可以为空。设置为False时,字段是必须填写的。

  • null:如果设置True,表示该列值允许为空。默认为False,如果此选项为False,建议加入default选项来设置默认值。

  • default:设置所在列的默认值,如果字段选项null=False,建议添加此项。

  • db_index:如果设置为True,表示为该列增加索引。

  • unique:如果设置为True,表示该字段在数据库中的值必须是唯一(不能重复出现)。

  • db_column:指定列的名称,如果不指定的话则采用属性名作为列名。

  • verbose_name:设置此字段在admin界面上的显示名称

3.5. 字段选项样例


创建一个属性,表示用户长度,长度30个字符,必须是唯一的,不能为空,添加索引

name = models.CharField(max_length=30, unique=True, null=False, db_index=True)

官方文档:

https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-options

3.6. 注意


修改过字段选项、添加或更改均要执行makemigrations和migrate

3.7. Meta类


使用内部Meta类,来给模型赋予属性,Meta类下面有很多内建的类属性,可以对模型类做一些控制:

示例:

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. 问题1:当执行python3 manage.py makemigrations出现如下迁移错误时的处理方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 数据库的迁移文件混乱的解决方法
  • 数据库中django_migrations表记录了migrate的’全过程’,项目个应用中的migrate文件与之对应,否则migrate会报错。

  • 解决方案:

  1. 删除所有migrations里所有的000?XXXX.py(__init_.py除外)

  2. 删除数据库

drop database mywebdb;

  1. 重新创建数据库

create database mywebdb default charset…;

  1. 重新生成migrations里面所有的000?_XXXX.py

python3 manage.py makemigrations

  1. 重新更新数据库

python3 manage.py migrate

五、Django Shell

=========================================================================

Django提供了一个交互式的操作项目叫Django Shell,它能够在交互模式用项目工程的代码执行相应的操作

利用Django Shell可以代替编写view的代码来进行直接操作

注意:项目代码发生变化时,重新进入Django shell

启动方式:

python3 manage.py shell

在这里插入图片描述

六、ORM操作

==================================================================

基本操作包括增删改查操作,即(CURD操作)

CURD是指在计算处理时的增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)

ORM CURD核心 → 模型类.管理器对象

6.1. 管理器对象


每个继承自models.Model的模型类,都会有一个objects对象被同样继承下来。这个对象叫管理器对象。

数据库的增删改查可以通过模型的管理器实现。

class MyModel(models.Model):

···

MyModel.objects.create(…) # objects 是管理器对象

6.2. 创建/插入数据


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. 查询数据


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. 更新数据


6.4.1. 单个数据

修改单个实体的某些字段值的步骤:

  1. 查:通过get()得到要修改的实体对象

  2. 改:通过对象.属性的方式修改数据

  3. 存:通过对象.save()保存数据

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-uKjd6grp-1712127130503)]
[外链图片转存中…(img-8wN7TFeT-1712127130504)]



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-wioseLsZ-1712127130504)]

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值