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())

最新文章

  1. rem是如何实现自适应布局的?
  2. Effective Objective-C 2.0 — 第8条:理解“对象等同性”这一概念
  3. 解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
  4. js封装 与 js高级用法 问题集合
  5. XSS攻击:SOHU视频XSS漏洞导致其用户成为DDOS肉鸡
  6. Android原生Calendar代码阅读(一)
  7. 用c#实现与飞环语音卡的交互
  8. Zencart批量删除无图片产品
  9. html的基本结构
  10. 你用.NET开发APP时,在云平台打包APP要填个“包名”的含义
  11. 【BZOJ4868】[六省联考2017]期末考试(贪心)
  12. Spring Boot 项目实战(三)集成 Swagger 及 JavaMelody
  13. Android Firebase Android google-cloud-tools
  14. C++ 作业 (循环链表构建队列)
  15. php 测试 程序执行时间,内存使用情况
  16. F5刷新缘何会引起表单重复提交
  17. mysql取电话号码的后四位字符
  18. 阿里云CentOS下安装jdk
  19. Python 模块化 import 语句介绍(一)
  20. html5新特性localStorage和sessionStorage

热门文章

  1. DOM元素
  2. PySpider的安装
  3. C#剪切生成高质量缩放图片
  4. 【SR汇总】算法时间效率
  5. MySql workbeach 更改侧边栏大小
  6. 'pybot.bat' 不是内部或外部命令,也不是可运行的程序
  7. 进程对列,生产者和消费者,JoinableQueue
  8. C#WinForm程序显示控制台窗口Console
  9. Spring Security登录超时,angular ajax请求出错自动跳转至登录页(jQuery也适用)
  10. AcitveReocrd事件和关联操作