auther: LiSoul
模型操作
1. 数据库连接
在项目子目录的
setting.py
中修改DATABASES
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'database_name', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
在项目子目录的
__init__.py
中填入
import pymysql
pymysql.install_as_MySQLdb()
2. 模型定义
- 创建APP
python django-admin.py startapp TestModel
- app目录下的
model.py
中创建你的模型
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
- 在
setting.py
中引入你创建的模型
INSTALLED_APPS = (
'app.apps.Appconfig',
)
- 模型常用操作
python manage.py migrate # 创建表结构
python manage.py makemigrations YouModel # 让Django知道我们模型的一些变更
python manage.py migrate YouModel # 创建自己模型的表结构
3. 数据库操作
1. 添加数据
- 方案一
book = models.Book(title="菜鸟教程",price=300,publish="菜鸟出版社",pub_date="2008-8-8")
book.save()
- 方案二
books = models.Book.objects.create(title="如来神掌",price=200,publish="功夫出版社",pub_date="2010-10-10")
一对多
- 方案一
# 获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
# 给书籍的出版社属性publish传出版社对象
book = models.Book.objects.create(title="菜鸟教程", price=200, pub_date="2010-10-10", publish=pub_obj)
- 方案二
# 获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
# 获取出版社对象的id
pk = pub_obj.pk
# 给书籍的关联出版社字段 publish_id 传出版社对象的id
book = models.Book.objects.create(title="冲灵剑法", price=100, pub_date="2004-04-04", publish_id=pk)
多对多
- 方案一
# 获取作者对象
chong = models.Author.objects.filter(name="令狐冲").first()
ying = models.Author.objects.filter(name="任盈盈").first()
# 获取书籍对象
book = models.Book.objects.filter(title="菜鸟教程").first()
# 给书籍对象的 authors 属性用 add 方法传作者对象
book.authors.add(chong, ying)
- 方案二
# 获取作者对象
chong = models.Author.objects.filter(name="令狐冲").first()
# 获取作者对象的id
pk = chong.pk
# 获取书籍对象
book = models.Book.objects.filter(title="冲灵剑法").first()
# 给书籍对象的 authors 属性用 add 方法传作者对象的id
book.authors.add(pk)
关联管理器(对象调用)
- 前提条件
- 多对多(双向均有关联管理器)
- 一对多(只有多的哪个类的对象有关联管理器,及反向才有)
- 语法格式
正向:属性名
反向:小写类名加_set
- 常用方法
函数 | 作用 |
---|---|
add() | 把指定的模型对象添加到关联对象集 |
create() | 创建一个新的对象,并同时将它添加到关联对象集之中 |
remove() | 从关联对象集中移除执行的模型对象 |
clear() | 从关联对象集中移除一切对象,删除关联,不会删除对象 |
2. 获取数据
函数 | 实现功能 | 返回类型 | 提示 |
---|---|---|---|
all() | 查询所有内容 | QuerySet | |
filter() | 查询符合条件的数据 | QuerySet | |
exclude() | 查询不符合条件的数据 | QuerySet | |
get() | 查询符合条件的数据 | 数据只能为一个,否则会报错 | |
order_by() | 对查询结果进行排序 | QuerySet | 降序为在字段前面加个负号- |
reverse() | 对查询结果进行反转 | QuerySet | |
count() | 查询数据的数量 | Int | |
first() | 返回第一条数据 | 相当于[1] | |
last() | 返回最后一条数据 | 相当于[-1] | |
exist() | 判断查询的结果QuerySet列表里是否有数据 | bool | |
values() | 查询部分字段的数据 | QuerySet | 字典序列 |
values_list() | 查询部分字段的数据 | QuerySet | 元组序列 |
distinct() | 对数据去重 | QuerySet | distinct() 一般是联合 values 或者 values_list 使用 |
- 模糊查询
方法 | 实现 | 后面数据 |
---|---|---|
__in | 读取区间 | List |
__gt | 大于号 | Int |
__gte | 大于等于号 | Int |
__it | 小于号 | Int |
__ite | 小于等于号 | Int |
__range | 左闭右闭区间 | List(两个元素) |
__contains | 包含 | String |
__icontains | 不区分大小写的包含 | String |
__startswith | 以指定字符开头 | String |
__endswith | 以指定字符结尾 | String |
__year | DateField数据类型的年份 | Int |
__month | DateField数据类型的月份 | Int |
__day | DateField数据类型的天数 | Int |
基于对象的跨表查询
- 语法格式
正向:属性名
反向:小写类名加_set
基于下划线的跨表查询
- 语法格式
正向:属性名称__跨表的属性名称
反向:小写类名__跨表的属性名称
聚合与分组查询
- 引入
from django.db.models import Avg,Max,Min,Count,Sum
聚合查询
聚合查询返回值的数据类型是字典。
聚合函数 aggregate() 是 QuerySet 的一个终止子句, 生成的一个汇总值,相当于 count()。
使用 aggregate() 后,数据类型就变为字典,不能再使用 QuerySet 数据类型的一些 API 了。
日期数据类型(DateField)可以用 Max 和 Min。
返回的字典中:键的名称默认是(属性名称加上__聚合函数名),值是计算出来的聚合值。
如果要自定义返回字典的键的名称,可以起别名:
aggregate(别名 = 聚合函数名("属性名称"))
分组查询
- 返回值:
分组后,用 values 取值,则返回值是 QuerySet 数据类型里面为一个个字典;
分组后,用 values_list 取值,则返回值是 QuerySet 数据类型里面为一个个元组。
MySQL 中的 limit 相当于 ORM 中的 QuerySet 数据类型的切片。
- 注意:
annotate 里面放聚合函数。
values 或者 values_list 放在 annotate 前面:values 或者 values_list 是声明以什么字段分组,annotate 执行分组。
values 或者 values_list 放在annotate后面: annotate 表示直接以当前表的pk执行分组,values 或者 values_list 表示查询哪些字段, 并且要将 annotate 里的聚合函数起别名,在 values 或者 values_list 里写其别名。
F()查询
- 引入
from django.db.models import F
- 用法
F("字段名称")
- 注意
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取余的操作。
Q()查询
- 引入
from django.db.models import Q
- 用法
Q(条件判断)
- 注意
Q 对象可以使用 & | ~ (与 或 非)操作符进行组合。
3. 修改数据
- 方案一
books = models.Book.objects.filter(pk=7).first()
books.price = 400
books.save()
- 方案二
books = models.Book.objects.filter(pk__in=[7,8]).update(price=888)
4. 删除数据
- 方案一
books=models.Book.objects.filter(pk=8).first().delete()
- 方案二
books=models.Book.objects.filter(pk__in=[1,2]).delete()