模型操作 1. 数据库连接auther: LiSoul
在项目子目录的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() | 从关联对象集中移除一切对象,删除关联,不会删除对象 |
| 函数 | 实现功能 | 返回类型 | 提示 |
|---|---|---|---|
| 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 数据类型的切片。
- 注意:
F()查询annotate 里面放聚合函数。
values 或者 values_list 放在 annotate 前面:values 或者 values_list 是声明以什么字段分组,annotate 执行分组。
values 或者 values_list 放在annotate后面: annotate 表示直接以当前表的pk执行分组,values 或者 values_list 表示查询哪些字段, 并且要将 annotate 里的聚合函数起别名,在 values 或者 values_list 里写其别名。
- 引入
from django.db.models import F
- 用法
F("字段名称")
- 注意
Q()查询Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取余的操作。
- 引入
from django.db.models import Q
- 用法
Q(条件判断)
- 注意
3. 修改数据Q 对象可以使用 & | ~ (与 或 非)操作符进行组合。
- 方案一
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()



