目录
模型层
ORM查询
单表操作
配置测试脚本
方式一:
直接在某一个应用的tests文件中书写下面内容
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
import django
django.setup()
# 一定要等待测试脚本搭建完毕,才能导入Django进行测试
from app01 import models
方式二:
直接新建一个任意名称的py文件,在里面也写上面的配置
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
import django
django.setup()
# 一定要等待测试脚本搭建完毕,才能导入Django进行测试
from app01 import models
数据的增删改查
增
#create方法
obj=models.表名.objects.create(字段名='xxx',)
#利用对象的绑定方法
obj=models.表名(字段名='xxx')
obj.save()
改
res = models.表名.objects.filter(pk=1)
pk会自动帮你查找到当前表的主键字段 所以后期我们都是用pk来指代主键字段filter查询出来的结果是一个Queryset对象
特点:
- 只要是queryset对象就可以无限制的调用queryset方法
- 只要是queryset对象就可以点query查看当前结果内部对应的sql语句
#方式一 利用queryset方法
models.表名.objects.filter(pk=1).update(字段名=值)
#方式二 利用对象
obj = models.表名.objects.get(pk=1)
obj.字段名 = 值
obj.save()
# 该方法不推荐使用,推荐使用queryset方法
get和filter区别
-
filter获取到的是一个queryset对象,类似于一个列表
-
get获取到的直接就是数据对象本身
当条件不存在的情况下,filter不报错直接返回一个空 (推荐使用queryset)
get直接报错
删
#利用queryset方法 delete()
models.表名.objects.filter(pk=3).delete()
#对象方法
obj = models.表名.objects.get(pk=3)
obj.save()
查
在配置文件中配置相应的代码即可查看所有orm语句内部对应的sql语句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}
1. all()
查询所有,返回queryset对象
res = models.Books.objects.all()
2. filter()
筛选,相当于原生sql语句中的where关键字,返回queryset对象
res = models.Books.objects.filter(pk=1,title='三')
3. get()
筛选,获取的是数据对象本身,条件不存在直接报错,查询条件必须唯一
res = models.Books.objects.get(title='西游记')
4. first()
取queryset对象中第一个数据对象
res = models.Books.objects.filter(title='西游记').first()
5.last()
取queryset对象中最后一个数据对象
res = models.Books.objects.filter(title='西游记').last()
6. count()
统计数据的个数
res = models.Books.objects.count()
7. values()
获取数据对象中指定的字段的值,可以有多个,返回的是列表套字典
res = models.Books.objects.values('title','price')
8. values_list()
获取数据对象中指定的字段的值,可以有多个,返回的是列表套元祖
res = models.Books.objects.values_list('title','price')
9. order_by()
按照指定的字段排序,默认是升序,如果要降序就在字段前面加负号
res1 = models.Books.objects.all().order_by('price')
10.reverse()
颠倒顺序,颠倒的对象必须有顺序
res3 = models.Books.objects.all().order_by('price').reverse()
11. exclude()
排除什么什么之外 返回的是queryset对象
res = models.Books.objects.all().exclude(title='三国演义')
12.exists()
判断查询结果是否有值,返回一个布尔值
res = models.Books.objects.filter(pk=1).exists()
13. dixtinct()
对查询结果进行去重
res = models.Books.objects.values('title','price').distinct()
双下划线查询
#查询价格大于500的书籍
res = models.Books.objects.filter(price__gt=500)
#查询价格小于400 的书籍
res = models.Books.objects.filter(price__lt=400)
#查询价格大于等于500
res = models.Books.objects.filter(price__gte=444.66) 对数字精确度不敏感
res = models.Books.objects.filter(price__gte=500)
#查询价格小于等于500的书籍
res = models.Books.objects.filter(price__lte=500)
#查询价格是222.66或者444.22或者500的书籍
res = models.Books.objects.filter(price__in=[222,444,500])
#查询价格在200到800之间的书籍
res = models.Books.objects.filter(price__range=(200,800)) # 顾头顾尾
#查询出版日期是2019年的书籍
res = models.Books.objects.filter(publish_date__year='2019')
#查询出版日期是1月份的书籍
res = models.Books.objects.filter(publish_date__month='1')
模糊查询
#查询书籍是以三开头的书
res = models.Books.objects.filter(title__startswith='三')
#查询书籍是以义结尾的书
res = models.Books.objects.filter(title__endswith='1')
#查询书籍名称中包含游字的书籍
res = models.Books.objects.filter(title__contains='游')
#查询书籍名称中包含字母p的书籍
res = models.Books.objects.filter(title__contains='p') # 默认区分大小写
res = models.Books.objects.filter(title__icontains='p') # 忽略大小写 加i
一对多字段数据的增删改查
增
#第一种 直接传表里实际的数据,跟数据主键值
models.Book.object.create(title='xxx',price=213,publish_id=1)
#第二种 传虚拟字段,跟数据对象即可
publish_obj= models.Publish.objects.filter(pk=2).first()
models.Book.objecets.create(title='sss',price=123,publish=publish_obj)
改
#第一种
models.Book.objects.filter(pk=1).update(publish_id=2)
#第二种
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)
删
models.Publish.objects.filter(pk=1).delete() #默认联级删除
多对多字段数据的增删改查
增
# 方法一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.add(1) #在第三张表里给书籍绑定一个主键为1的作着
#方法二
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.authors.add(author_obj)
#add方法 能够朝第三张关系表添加数据,既支持数字,也支持对象,都可以是多个
改
# 方法一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.set((1,3))
#方法二
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.authors.set((author_obj))
#set修改多对多关系表中的数据,既可以传数字也可以传对象,但是需要注意的是括号内必须是可迭代对象,都支持多个
删
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.remove(1,2)
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.authors.remove(author_obj)
# remove既可以传数字 也可以穿对象 并且都支持传多个 不需要迭代
清空
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.clear()
# clear清空书籍相关所有记录 括号内不需要传递参数
跨表查询
正反向查询
关系字段在谁哪 由谁查谁就是正向
如果关系字段 就是反向
正向查询按字段
反向查询按表名小写 + _set
当正向查询点击外键字段数据有多个的情况下 需要.all()