# 一、 模型 ## 1.1 概述 为了构建和操纵`WEB`项目的数据,`Django`提供了一个抽象的模型层,通过它可以便捷的实现数据表及数据(记录)的管理。 在`Django`中把每一张数据表称为一个模型(`Model`),每个模型必须要继承`django.db.models.Model` 通过`MySQL`客户端创建数据库,代码如下: ```mysql create database if not exists books default character set 'utf8'; ``` ## 1.2 `Django`配置`MySQL`数据库 第一步:安装`Python`开发库和头文件 ```shell sudo apt-get install python3-dev default-libmysqlclient-dev ``` 第二步:安装`mysqlclient` ```shell sudo pip3 install mysqlclient ``` ## 1.3 `settings.py`中关于`MySQL`的配置 ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # MySQL服务器的地址 'HOST':'127.0.0.1', # MySQL服务器的端品号 'PORT':3306, # 用户名 'USER':'root', # 密码 'PASSWORD':'123456', # 数据库名称 'NAME': 'books', } } ``` 上述配置类似于: ```shell mysql -h127.0.0.1 -P3306 -uroot -p123456 -Dbooks ``` # 二、`ORM` `ORM(Object-Relational Mapping)`,对象关系映射,是一种将面向对象的编程语言和关系型数据库之间的映射技术。 在`Django`中每一个模型(类)都映射数据库中的一张数据表。 模型的属性映射成数据表的字段; 模型对象映射成数据表中的记录。 ![1690253312807.png][1] ![1690253299172.png][2] `ORM`的优点是: a.不再编写各种`SQL`语句 b.提升工作效率 其缺点: a.会存在一定的性能损失 b.某些复杂的SQL可能无法完成 ## 2.1 创建模型 创建模型实质就是创建表结构!!! -- 也就是`CREATE TABLE` ```python from django.db import models class ModelName(models.Model): propertyName = models.FieldType(options) ... ... ``` 说明: - `ModelName`最终形成数据表的表名称 - `propertyName`最终形成数据表的字段名称 - `fieldType`指字段的数据类型,只不过在`Django`用它来表示 ## 2.2 字段类型 | 字段类型 | `MySQL数据类型` | | ------------------------------------------------------------ | ----------------------------------- | | `AutoField()` | `INT AUTO_INCREMENT PRIMARY KEY` | | `BigAutoField()` | `BIGINT AUTO_INCREMENT PRIMARY KEY` | | `BooleanField()` | `TINYINT(1)` | | `CharField(max_length=长度)` | `VARCHAR(长度)` | | `DecimalField(max_digits=最大长度,decimal_places=小数点后的位数)` | `DECIMAL(X,Y)` | | `FloatField()` | `DOUBLE` | | | | | | | | | | ## 2.4 数据迁移 数据迁移是在`Django`中修改模后,将这些修改过程应用于数据库的过程。 第一步:创建迁移文件 ```shell python3 manage.py makemigrations ``` 第二步:应用迁移 ```python python3 manage.py migrate ``` # 三、管理器 管理器`Manager`是一种接口,它赋予了`Django`模型操作数据表(如增删改查等)的能力。 默认情况下,`Django`为所有的模型添加了一个名称为`objects`的管理器。访问模型的管理器的语法结构: ```python ModelName.objects ``` > `模型`是指数据表的结构,如包含有哪些字段,数据类型是什么?... > > `管理器`则提供了针对数据表增、删、改、查等能力; > > 查询结果集则只针对于`SELECT`操作有效。 # 四、`QuerySet` 对象 `QuerySet`称为查询集或查询结果集,用于表示与模型管理器所关联的模型的查询结果。 `all()` `all()`方法用于返回当前`QuerySet`的全部记录,语法结构是: ```python QuerySet.all() ``` `get()` `get()`方法用于返回与指定查找的参数相匹配的记录,但在使用时需要注意必须保证查询的唯一性,也就代表一般都是按**主键**进行查找。 ```python QuerySet.get(id=5)#必须保证唯一性 QuerySet.get(pk=5) #必须按主键查询 ``` 标准`SQL` `SELECT`语句为: ```mysql SELECT expression[,...] FROM table [WHERE condition] [GROUP BY field] [HAVING field_name] [ORDER BY field [ASC|DESC][,...]] [LIMIT [offset,]row_count] ``` 谓语查询 谓语查询实际上就是`SQL`语句的中的`WHERE`子句,其基本的语法结构是: ```python ModelName.objects.filter(field__lookuptype=value) ``` `filter()`方法用于返回一个新的`QuerySet`对象,其中包含有与指定参数相匹配的记录。 `field`指要进行条件筛选的字段名称 `lookuptype`指运算符的英文的对应名称,假设现在要查询`booklist`数据表中`price`字段值的大于100的所有记录,SQL语句为 ```sql SELECT * FROM booklist WHERE price > 100 ``` `Django`中: ```python BookList.objects.filter(price__gt=100) ``` 常用的谓语查询有: `exact`,完全匹配指定值 ```python book = BookList.objects.filter(id__exact=9) ``` `contains`,包含指定值(区分大小写) ```python books = BookList.objects.filter(bookname__contains='906') ``` `in`,匹配指定列表或元组内的任意一个值 ```python books = BookList.objects.filter(id__in =[10,22,39]) ``` `gt`,匹配大于指定值 ```python books = BookList.objects.filter(price__gt = 1000 ) ``` `lt`,匹配小于指定值 ```python books = BookList.objects.filter(price__lt = 30 ) ``` `gte`,匹配大于或等于指定值 ```python books = BookList.objects.filter(id__gte = 740 ) ``` `lte`,匹配小于或等于指定值 ```python books = BookList.objects.filter(id__lte = 10 ) ``` `startswith`,匹配以指定值开头 ```python books = BookList.objects.filter(bookname__startswith='甲骨文') ``` `endswith`,匹配以指定值结束 ```python books = BookList.objects.filter(bookname__endswith='甲骨文') ``` `range`,匹配指定以元组内第一个元素为最小值,第二个元素为最大值的对象(含) ```python books = BookList.objects.filter(id__range=(10,15)) ``` 多个条件,如: ```python books = BookList.objects.filter(price__gt=100,id__gte=500) ``` `values()` `values()`方法用于指定要返回的字段,其返回值为`QuerySet`,语法结构是: ```python QuerySet.values(*fields) ``` 如: ```python BookList.objects.values('id','bookname','price').filter ``` `first()` 返回查询结果集中的第一个对象,如果没有匹配的对象,则返回`None` ```python QuerySet.first() ``` `last()` 返回查询结果集中的最后个对象,如果没有匹配的对象,则返回`None` ```python QuerySet.last() ``` `count()` `count()` 用于获取查询结果集包含的行数,语法结构为: ```python QuerySet.count() ``` [1]: https://www.63zi.com/usr/uploads/2024/11/3010630770.png [2]: https://www.63zi.com/usr/uploads/2024/11/2577305185.png Loading... # 一、 模型 ## 1.1 概述 为了构建和操纵`WEB`项目的数据,`Django`提供了一个抽象的模型层,通过它可以便捷的实现数据表及数据(记录)的管理。 在`Django`中把每一张数据表称为一个模型(`Model`),每个模型必须要继承`django.db.models.Model` 通过`MySQL`客户端创建数据库,代码如下: ```mysql create database if not exists books default character set 'utf8'; ``` ## 1.2 `Django`配置`MySQL`数据库 第一步:安装`Python`开发库和头文件 ```shell sudo apt-get install python3-dev default-libmysqlclient-dev ``` 第二步:安装`mysqlclient` ```shell sudo pip3 install mysqlclient ``` ## 1.3 `settings.py`中关于`MySQL`的配置 ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # MySQL服务器的地址 'HOST':'127.0.0.1', # MySQL服务器的端品号 'PORT':3306, # 用户名 'USER':'root', # 密码 'PASSWORD':'123456', # 数据库名称 'NAME': 'books', } } ``` 上述配置类似于: ```shell mysql -h127.0.0.1 -P3306 -uroot -p123456 -Dbooks ``` # 二、`ORM` `ORM(Object-Relational Mapping)`,对象关系映射,是一种将面向对象的编程语言和关系型数据库之间的映射技术。 在`Django`中每一个模型(类)都映射数据库中的一张数据表。 模型的属性映射成数据表的字段; 模型对象映射成数据表中的记录。 ![1690253312807.png][1] ![1690253299172.png][2] `ORM`的优点是: a.不再编写各种`SQL`语句 b.提升工作效率 其缺点: a.会存在一定的性能损失 b.某些复杂的SQL可能无法完成 ## 2.1 创建模型 创建模型实质就是创建表结构!!! -- 也就是`CREATE TABLE` ```python from django.db import models class ModelName(models.Model): propertyName = models.FieldType(options) ... ... ``` 说明: - `ModelName`最终形成数据表的表名称 - `propertyName`最终形成数据表的字段名称 - `fieldType`指字段的数据类型,只不过在`Django`用它来表示 ## 2.2 字段类型 | 字段类型 | `MySQL数据类型` | | ------------------------------------------------------------ | ----------------------------------- | | `AutoField()` | `INT AUTO_INCREMENT PRIMARY KEY` | | `BigAutoField()` | `BIGINT AUTO_INCREMENT PRIMARY KEY` | | `BooleanField()` | `TINYINT(1)` | | `CharField(max_length=长度)` | `VARCHAR(长度)` | | `DecimalField(max_digits=最大长度,decimal_places=小数点后的位数)` | `DECIMAL(X,Y)` | | `FloatField()` | `DOUBLE` | | | | | | | | | | ## 2.4 数据迁移 数据迁移是在`Django`中修改模后,将这些修改过程应用于数据库的过程。 第一步:创建迁移文件 ```shell python3 manage.py makemigrations ``` 第二步:应用迁移 ```python python3 manage.py migrate ``` # 三、管理器 管理器`Manager`是一种接口,它赋予了`Django`模型操作数据表(如增删改查等)的能力。 默认情况下,`Django`为所有的模型添加了一个名称为`objects`的管理器。访问模型的管理器的语法结构: ```python ModelName.objects ``` > `模型`是指数据表的结构,如包含有哪些字段,数据类型是什么?... > > `管理器`则提供了针对数据表增、删、改、查等能力; > > 查询结果集则只针对于`SELECT`操作有效。 # 四、`QuerySet` 对象 `QuerySet`称为查询集或查询结果集,用于表示与模型管理器所关联的模型的查询结果。 `all()` `all()`方法用于返回当前`QuerySet`的全部记录,语法结构是: ```python QuerySet.all() ``` `get()` `get()`方法用于返回与指定查找的参数相匹配的记录,但在使用时需要注意必须保证查询的唯一性,也就代表一般都是按**主键**进行查找。 ```python QuerySet.get(id=5)#必须保证唯一性 QuerySet.get(pk=5) #必须按主键查询 ``` 标准`SQL` `SELECT`语句为: ```mysql SELECT expression[,...] FROM table [WHERE condition] [GROUP BY field] [HAVING field_name] [ORDER BY field [ASC|DESC][,...]] [LIMIT [offset,]row_count] ``` 谓语查询 谓语查询实际上就是`SQL`语句的中的`WHERE`子句,其基本的语法结构是: ```python ModelName.objects.filter(field__lookuptype=value) ``` `filter()`方法用于返回一个新的`QuerySet`对象,其中包含有与指定参数相匹配的记录。 `field`指要进行条件筛选的字段名称 `lookuptype`指运算符的英文的对应名称,假设现在要查询`booklist`数据表中`price`字段值的大于100的所有记录,SQL语句为 ```sql SELECT * FROM booklist WHERE price > 100 ``` `Django`中: ```python BookList.objects.filter(price__gt=100) ``` 常用的谓语查询有: `exact`,完全匹配指定值 ```python book = BookList.objects.filter(id__exact=9) ``` `contains`,包含指定值(区分大小写) ```python books = BookList.objects.filter(bookname__contains='906') ``` `in`,匹配指定列表或元组内的任意一个值 ```python books = BookList.objects.filter(id__in =[10,22,39]) ``` `gt`,匹配大于指定值 ```python books = BookList.objects.filter(price__gt = 1000 ) ``` `lt`,匹配小于指定值 ```python books = BookList.objects.filter(price__lt = 30 ) ``` `gte`,匹配大于或等于指定值 ```python books = BookList.objects.filter(id__gte = 740 ) ``` `lte`,匹配小于或等于指定值 ```python books = BookList.objects.filter(id__lte = 10 ) ``` `startswith`,匹配以指定值开头 ```python books = BookList.objects.filter(bookname__startswith='甲骨文') ``` `endswith`,匹配以指定值结束 ```python books = BookList.objects.filter(bookname__endswith='甲骨文') ``` `range`,匹配指定以元组内第一个元素为最小值,第二个元素为最大值的对象(含) ```python books = BookList.objects.filter(id__range=(10,15)) ``` 多个条件,如: ```python books = BookList.objects.filter(price__gt=100,id__gte=500) ``` `values()` `values()`方法用于指定要返回的字段,其返回值为`QuerySet`,语法结构是: ```python QuerySet.values(*fields) ``` 如: ```python BookList.objects.values('id','bookname','price').filter ``` `first()` 返回查询结果集中的第一个对象,如果没有匹配的对象,则返回`None` ```python QuerySet.first() ``` `last()` 返回查询结果集中的最后个对象,如果没有匹配的对象,则返回`None` ```python QuerySet.last() ``` `count()` `count()` 用于获取查询结果集包含的行数,语法结构为: ```python QuerySet.count() ``` [1]: https://www.63zi.com/usr/uploads/2024/11/3010630770.png [2]: https://www.63zi.com/usr/uploads/2024/11/2577305185.png 最后修改:2024 年 11 月 09 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏