Django基础之模型(models)层(上)
Django基础之模型(models)层
Django测试环境搭建:拷贝manage.py中的行代码放到tests.py文件中导入模块
import django,django.setup()
如果你想查看orm语句内部真正的sql语句有2种方法:
1.如果是queryset对象,就可以.query查看该queryset对象的内部sql语句
2.在settings.py文件中配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}}
单表查询
增
方式一:
models.Book.objects.create(title = '三国演义',price = 12.22)
方式二:
book_obj = models.Book(title='三国演义',price='12.22')
book_obj.save()
删
models.Book.objects.filter(pk=2).delete()
改
models.Book.objects.filter(pk=2).update(title = '红楼梦',price = 22.22)
查
res = models.Book.objects.filter(pk=2)
必知必会13条
all():查所有,查询结果为Queryset对象
res = models.Book.objects.all()
print(res)
filter:查询结果为Queryset对象
res = models.Book.objects.filter(pk=2)
get():查询结果为数据对象本身,和filter查询相似,不推荐使用
res = models.Book.objects.get(pk=2)
first():查询第一个
res = models.Book.objects.first()
last():查询最后一个
res = models.Book.objects.last() #res可以.title,.price
exclude():哪一个排除之外
res = models.Book.objects.exclude(pk=3)
values():查询结果为列表套字典的Queryset对象
res = models.Book.objects.values('title')
value_list():查询结果为列表套元组的Queryset对象
res = models.Book.objects.values_list('title')
count():统计数据的条数
res = models.Book.objects.count('title')
res = models.Book.objects.all.count('title')
distinct():数据必须是一模一样的情况下去重
res = models.Book.objects.distinct() #无变化
res = models.Book.objects.values('title').distinct()
order_by():排序
res = models.Book.objects.order_by('price') #默认升序
res = models.Book.objects.order_by('-price') #降序
reverse():排序后反转(才有意义)
res = models.Book.objects.reverse()
exists():是否存在
models.Book.objects.filter(pk=1).exists()
神奇的双下划线查询
查询价格大于200的书籍
models.Book.objects.filter(price__gt=200)
查询价格小于200的书籍
models.Book.objects.filter(price__lt=200)
查询价格大于等于200的书籍
models.Book.objects.filter(price__gte=200)
查询价格小于等于200的书籍
models.Book.objects.filter(price__lte=200)
查询价格是200元或者300元的书籍
res = models.Book.objects.filter(price__in=[200,300])
查询价格是200到500元之间的书籍
res = models.Book.objects.filter(price__range=(200,500)) #顾头不顾尾
查询书籍中包含p的书籍
res = models.Book.objects.filter(title__contains='p') #区分大小写
res = models.Book.objects.filter(title__icontains='p') #不区分大小写
查询书籍名称是以三开头的书籍
res = models.Book.objects.filter(title__startswith="三")
查询书籍名称是以三结尾的书籍
res = models.Book.objects.filter(title__endswith="三")
查询出版日期是2019年的书籍
res = models.Book.objects.filter(data__year="2019")
查询出版日期是10月份的书籍
res = models.Book.objects.filter(data__month="10")
多表查询
外键的字段的增删改查
一对多字段的增删改查
增
方式一:
models.Book.objects.create(title='xxx',price=66.66,publish_id=1)
方式二:
publish_obj =models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='xxx',price=66.66, publish_id=publish_obj)
查
book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.publish.name)
print(book_obj.publish_id)
改
方式一:
models.Book.objects.filter(pk=3).update(publish_id=3)
方式二:
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=3).update(publish_id=publish_obj) #给书更换出版社
删
models.Book.objects.filter(pk=3).delete()
多对多字段的增删改查
增
方式一:
book_obj = models.Book.objects.filter(pk=3).first()
print(book_obj.author) # 就相当于已经到书籍与作者的关系表中
book_obj.author.add(1)
book_obj.author.add(2, 3) # 还可以添加多个值
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.author.add(author_obj)
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.add(author_obj, author_obj1) # 还可以添加多个值
'''
add() 括号内 既可以串数字,也可以传对象
并且支持传多个
但是括号内必须是可迭代对象
'''
删
#方式一
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.remove(2)
book_obj.author.remove(1,2)
#方式二
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.remove((author_obj, author_obj1))
'''
remove() 括号内 既可以串数字,也可以传对象
并且支持传多个
'''
#清空
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.clear()
'''clear括号内不需要传任何参数 直接清空当前书籍对象所有的记录'''
改
#方式一
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.author.set([3, ])
#方式二
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.author.set((author_obj, author_obj1))
'''
set() 括号内 既可以串数字,也可以传对象
并且支持传多个
但是括号内必须是可迭代对象
'''
查
表与表之间的关联查询
基于对象的跨表查询(子查询)
正向查询按字段 反向查询按表名小写
当该字段所对应的数据有多个的时候 需要加.all(),否则点外键字段直接就能够拿到数据对象
查询书籍是Python入门的出版社名称(一对多)
book_obj = models.Book.objects.filter(title='python入门').first()
print(book_obj.publish.name)
print(book_obj.publish.addr)
查询书籍主键为6的作者姓名(多对多)
book_obj = models.Book.objects.filter(pk=6).first()
print(book_obj.author) #None
print(book_obj.author.all()) #拿到当前这本书所有的作者
查询作者是Jason的手机号(一对一)
author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.author_detail.phone)
查询出版社是东方出版社出版过的书籍
publish_obj = models.Publish.objects.filter(name="东方出版社").first()
print(publish_obj.book_set.all())
查询作者是Jason写过的所有的书
author_obj = models.Author.objects.filter(name='json').first()
print(author_obj.book_set.all())
查询手机号是110的作者
phone_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(phone_obj.author)
基于双下划线的跨表查询(连表查询)
查询书籍是Python入门的出版社名称
正向:
models.Book.objects.filter(name='python入门').values('publish__name')
反向:
models.Publish.objects.filter(book__title='python入门').value('name')
查询作者是jason的手机号码
正向:
models.Author.objects.filter(name='json').values('author_detail__phone')
反向
models.AuthorDetail.objects.filter(author__book__author='json').values('phone','author_age') #还可以加自己的年龄
查询手机号是120的作者姓名和地址
正向
models.AuthorDetail.objects.filter(phone='120').values('author__name')
反向
models.Author.objects.filter(author_detail__phone=120).values('name',,'author_detail__addr')
查询出版社是东方出版社出版的书籍名称
正向:
models.Publish.objects.filter(name='东方出版社').values('book__title')
反向:
models.Book.objects.filter(author__book__publish='东方出版社').values('title')
查询作者是jason的写过的书的名字和价格
正向:
models.Author.objects.filter(name='json').values('book__title','book__price')
反向:
models.Book.objects.filter(author__name='json').values('title','price')
查询书籍是python入门的作者的手机号
正向:
models.Book.objects.filter(name='python入门').values('authors__author_detail__phone')
反向:
models.AuthorDetail.objects.filter(author__book__title='python入门').values('phone')
补充知识
auto_now:每次修改数据的时候,都会自动更新时间
auto_now_add:在创建数据的时候,会自动将当前时间记录下来,后期如果你不人为修改的话,数据不变
queryset:只要是queryset对象就可以无限的点queryset对象的方法
eg:一步步筛选
queryset.excult(pk=1).filter(pk=3).filter(pk=4)
return:return返回的必须是字符串,其他的类型直接报错,此处可以写在models.py中。
正反向概念:
书籍对象查出版社 外键字段在书籍 正向查询
出版社查书籍 外键字段在书籍 反向查询
Django基础之模型(models)层(上)的更多相关文章
- Django基础之视图(views)层、模板层
目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...
- Django基础之路由(urls)层
目录 Django基础之路由(urls)层 无名分组与有名分组 无名分组 有名分组 反向解析 前段解析 后端解析 无名分组反向解析 前段解析 后端解析 有名分组的反向解析 前段解析 后端解析 路由分发 ...
- Django基础(3)----模型层-单表操作,多表创建
昨日内容回顾: 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} { ...
- Django基础之模型层(02)
1 重要概念 # 多表查询 """ 正向查询 反向查询 当前查询对象是否含有外键字段 如果有就是正向 没有无则是反向 口诀: 正向查询按外键字段 多对多需要额外再加一个. ...
- Django基础之模型层(下)
聚合查询 关键字:aggregate from django.db.models import Max,Min,Sum,Count,Avg 统计所有书的平均价格 models.Book.objects ...
- Django基础之模型层(01)
内容概要 查询关键字 MySQL select from where group by having order by distinct limit r ...
- Django基础-02篇 Models的属性与字段
1.models字段类型 AutoField():一个IntegerField,根据可用ID自动递增.如果没指定主键,就创建它自动设置为主键. IntegerField():一个整数: FloatFi ...
- 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分
老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/guobaoyuan/ 开哥blog: https://home.cnblogs.com/u ...
- 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分
老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分 老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...
随机推荐
- [spring cloud] [error] java.lang.IllegalStateException: Only one connection receive subscriber allowed.
前言 最近在开发api-gateway的时候遇到了一个问题,网上能够找到的解决方案也很少,之后由公司的大佬解决了这个问题.写下这篇文章记录一下解决方案.希望可以帮助到更多的人. 环境 java版本:8 ...
- 读redux源码总结
redux介绍 redux给我们暴露了这几个方法 { createStore, combineReducers, bindActionCreators, applyMiddleware, compos ...
- IntelliJ IDEA工具增加test测试方法,报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
是因为我在IntelliJ IDEA中,通过plugins增加 插件的时候,在 增加的测试类是junit4.12,改版本的jar包不再包含hamcrest-library.jar .我是通过将自己的项 ...
- android data binding jetpack VI 清理一些概念。BR 运算表达式
android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...
- C++学习 之 初识变量和基本类型 之 内置类型
声明: 本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方. 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予 ...
- kvm网络虚拟化(vlan,bond,vlan+bond)(3)
一.Linux Bridge网桥管理 网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源. VM2 的虚拟网卡 vnet1 也连接到了 br0 上. 现在 VM1 和 VM2 之间可以通信,同时 ...
- ojdbc15-10.2.0.4.0.jar maven 引用报错 Dependency 'com.oracle:ojdbc15:10.2.0.4.0' not found
ojdbc15-10.2.0.4.0.jar maven 引用报错 问题现象 在 Maven 工程中引用 ojdbc15-10.2.0.4.0.jar 报错,报错信息:Dependency 'com. ...
- MySQL乱码的原因和设置UTF8数据格式
https://segmentfault.com/a/1190000018662023 MySQL使用时,有一件很痛苦的事情肯定是结果乱码.将编码格式都设置为UTF8可以解决这个问题,我们今天来说下为 ...
- Java 操作Word表格
本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...
- 基于nodeJS的小说爬虫实战
背景与需求分析 最近迷恋于王者荣耀.斗鱼直播与B站吃播视频,中毒太深,下班之后无心看书. 为了摆脱现状,能习惯看书,我开始看小说了,然而小说网站广告多而烦,屌丝心态不愿充钱,于是想到了爬虫. 功能分析 ...