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