django单表查询

必知必会13条

1.all() 查询所有 QuerySet

res=models.Book.objects.all()#惰性查询
print(res)
for i in res:
print(i.title)

2.filter() 查询指定范围 QuerySet

res=models.Book.objects.filter(pk=3)
print(res)

3.get() 查询单个对象,若有多个数据会报错,不建议使用

res=models.Book.objects.get(pk=2)
print(res.title)

4.first() 拿第一个

res=models.Book.objects.filter(pk=2).first()
print(res)

5.last() 拿最后一个

res=models.Book.objects.filter(pk=1).last()
print(res)

6.exclude() 除此之外 QuerySet

res = models.Book.objects.exclude(pk=3).filter(pk=4).filter(pk=4)
print(res)

7.values() 查出所有的title以列表套字典形式 QuerySet

res=models.Book.objects.values('title')
print(res)
for r in res:
print(r.get('title'))

8.values_list() QuerySet 同上列表套元组

res = models.Book.objects.values_list('title')
print(res)

9.count() 统计个数

res=models=Book.objects.all().count()
print(res)

10.distinct() 去重(必须是数据全一样才能去重,包括主键)

res=models.Book.objects.all().distinct()
res1=models.Book.objects.values('title').distinct()
print(res,res1)

11.order_by() 排序默认升序

res=models.Book.objects.order_by('price')
#res=models.Book.objects.order_by('-price')#倒序的一种方式
print(res)

12.reverse() 必须是已经排序好的才可以反转

res=models.Book.objects.order_by('price').reverse()
print(res)

13.exists() 是否为空,返回布尔值

res=modles.Book.objects.all().exists()
print(res)

双下划线查询来咯

查询价格大于200的书籍

res=models.Book.objects.filter(price__gt=200)

查询价格小于200的书籍

res = models.Book.objects.filter(price__lt=200)

查询价格大于或者等于200的书籍

res = models.Book.objects.filter(price__gte=200)

价格是200或者123.23或者666.66的

res = models.Book.objects.filter(price__in=[200,123.23,666.66])

价格在200到700之间的

res = models.Book.objects.filter(price__range=(200,700))

模糊匹配

like % _

查询书籍名称中包含p的

res =models.Book.objects.filter(title__contains='p')#区分大小写
res =models.Book.objects.filter(title__icontains='p')#不分大小写

查询以三开头的书籍

res = models.Book.objects.filter(title__startswith='三')
res1 = models.Book.objects.filter(title__endswith='P')
print(res1)

查询某年某月的书籍

res = models.Book.objects.filter(publish_date__year='2019')
res = models.Book.objects.filter(publish_date__month='10')

多表操作

一对多增删改查

#传publish_id时传id值
models.Book.objects.create(title='三国演义',price=123.23,publish_id=1)
#若传publish则传publish对象
publish_obj=models.Book.objects.filter(pk=1).first()
models.Book.objects.create(title='三国演义',price=123.23,publish=publish_obj)

book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.publish) # 获取到当前所对应的出版社对象
print(book_obj.publish_id) # 获取到的就是表中的实际字段

models.Book.objects.filter(pk=1).update(publish_id=3)
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)

models.Publish.objects.filter(pk=2).delete()
默认也是级联更新 级联删除

多对多增删改查(操作的都是第三张表)

增add

book_obj=models.Book.objects.filter(pk=3).first()
print(book_obj.authors)
book_obj.authors.add(1,2) author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.add(author_obj)
book_obj.authors.add(author_obj,author_obj1)
"""
add() 括号内既可以传数字也可以传数据对象
并且都支持传多个
"""

改set

book_obj = models.Book.objects.filter(pk=3).first()
# book_obj.authors.set([3,])
# book_obj.authors.set([1,3])
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.authors.set((author_obj,))
book_obj.authors.set((author_obj,author_obj1))
"""
set() 括号内 既可以传数字也传对象
并且也是支持传多个的
但是需要注意 括号内必须是一个可迭代对象
"""

删remover

book_obj = models.Book.objects.filter(pk=3).first()
# book_obj.authors.remove(2)
# book_obj.authors.remove(1,2) author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.remove(author_obj)
book_obj.authors.remove(author_obj,author_obj1)
"""
remove() 括号内 既可以传数字也传对象
并且也是支持传多个的
"""

清空clear

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.clear()
"""clear()括号内不需要传任何参数 直接清空当前书籍对象所有的记录"""

跨表查询

"""
ORM跨表查询
1.子查询
2.连表查询 正反向的概念
外键字段在谁那儿 由谁查谁就是正向 谁手里有外键字段 谁就是正向查
没有外键字段的就是反向
书籍对象 查 出版社 外键字段在书籍 正向查询
出版社 查 书籍 外键字段在书籍 反向查询 正向查询按字段
反向查询按表名小写 ... """
"""
# 1.基于对象的跨表查询 子查询
# 1.查询书籍是python入门的出版社名称
book_obj = models.Book.objects.filter(title='python入门').first()
# 正向查询按字段
print(book_obj.publish.name)
print(book_obj.publish.addr)
# 2.查询书籍主键是6的作者姓名
book_obj = models.Book.objects.filter(pk=6).first()
# print(book_obj.authors) # app01.Author.None
print(book_obj.authors.all())
# 3.查询作者是jason的手机号
author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.author_detail.phone)
print(author_obj.author_detail.addr)
"""
正向查询 按字段
当该字段所对应的数据有多个的时候 需要加.all()
否者点外键字段直接就能够拿到数据对象
"""
# 4.查询出版社是东方出版社出版过的书籍
publish_obj = models.Publish.objects.filter(name='东方出版社').first()
# print(publish_obj.book_set) # app01.Book.None
print(publish_obj.book_set.all())
# 5.查询作者是jason写过的所有的书
author_obj = models.Author.objects.filter(name='jason').first()
# print(author_obj.book_set) # app01.Book.None
print(author_obj.book_set.all())
# 6.查询手机号是110的作者
author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(author_detail_obj.author)
print(author_detail_obj.author.name)
print(author_detail_obj.author.age)
"""
反向查询按表名小写
什么时候需要加_set
当查询的结果可以是多个的情况下 需要加_set.all()
什么时候不需要加_set
当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可
"""
# 7.查询书籍是python入门的作者的手机号
book_obj = models.Book.objects.filter(title='python入门').first()
print(book_obj.authors.all())

django初步了解4的更多相关文章

  1. django初步了解2

    目录 django初步了解2 表的字段增删改查 数据的增删改查 反向解析和分组 路由分发 名称空间 伪静态 虚拟环境 django初步了解2 表的字段增删改查 新增的字段 1.直接提供默认值 defa ...

  2. django初步了解

    目录 学前了解 wsgiref模块( web服务网关接口) 根据不同的功能拆封成不同的py文件 动静态网页 HTTP协议 django初步了解1 1.小白必会三板斧 2.静态文件配置 3.reques ...

  3. Django初步(一):安装和简单演示

    参考:Windows下安装Django:http://www.th7.cn/Program/Python/201305/136301.shtml

  4. django初步了解3

    目录 JsonResponse模块 form表单上传文件 FBV与CBV django settings源码分析及实际应用 模板语法 模板传值 模板过滤器 标签 if标签 for标签 with标签 自 ...

  5. Django初步完成:登录、注册、退出

    python环境:python2.7 开发工具:pycharm 项目名称:mysite5 app名称:online settings:映射app路径 INSTALLED_APPS = [ 'djang ...

  6. django初步--+urls解析

    1.静态文件配置: 你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的. 2.django如何给用户开设资源接口 ...

  7. django初步了解(一)

    安装django pip3 install django==版本号 创建一个djangp项目 django-admin startproject 项目名 目录介绍: 运行django项目: pytho ...

  8. Django初步皮毛

    Django是一个用python编写的Web框架. #Django安装 pip install Django 然后是配置环境变量,将这目录添加到系统环境变量中: C:\Python33\Lib\sit ...

  9. Django初识

    web框架 Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口.标准样板以及会话管理等,可提升代码的可再用性.简单地说,就是你用别人搭建好的舞台来做表演,用别人做好 ...

随机推荐

  1. Python基础之range()

    range:指定范围,生成指定数字. 1. range() for i in range(1, 10): print(i) 执行结果为: 1 2 3 4 5 6 7 8 9 2. range()步长 ...

  2. MySQL之pymysql

    pymysql的安装 pip install PyMySQL 连接数据库   import pymysql db = pymysql.connect("数据库ip","用 ...

  3. Mybatis源码学习之事务管理(八)

    简述 在实际开发中,数据库事务的控制是一件非常重要的工作,本文将学习Mybatis对事务的管理机制.在Mybatis中基于接口 Transaction 将事务分为两种,一种是JdbcTransacti ...

  4. vue 循环Redio

    标准用法,做个笔记.(图示是elementUI,其他框架大同小异) <el-radio-group @change="changePayHandler" v-model=&q ...

  5. Linux设备驱动程序 之 字符设备的注册

    内核内部使用struct cdev结构来标识字符设备,在内核调用设备的操作之前,必须分配并注册一个或者多个上述结构,为此,我们的代码需要包含<linux/cdev.h>,其中定义了这个结构 ...

  6. React入门----基础篇

    React 背景介绍 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做 ...

  7. linux中安装python

    1.首先切换目录 大型的软件一定要安装在/ opt中  规范 cd /opt 2.下载python3的源码 wget https://www.python.org/ftp/python/3.6.2/P ...

  8. SpringCloud(七)之SpringCloud的链路追踪组件Sleuth实战,以及 zipkin 的部署和使用

    一.前言 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案 ,并且兼容了zipkin,提供了REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序 . ...

  9. maven项目无法导入Oracle的jdbc连接jar包【我】

    导入一个maven项目,启动一直报错 找不到Oracle的jdbc连接驱动Class, 用Eclipse导入 ojdbc14.jar 连接包,各种方法都无效,无法引入到部署后的lib目录中,可以直接放 ...

  10. android stdio 首次安装配置

    http://www.cnblogs.com/smyhvae/p/4390905.html 不启用 加快模拟器调试 这个玩意儿打开老是报什么 android 1.0的问题 导致编译不起来 直接关了 S ...