必知必会13条

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django django.setup() #以上为脚本,可以在manage.py中获得 from app01 import models # all 获取所有的数据 QuerySet 对象列表
# ret = models.Person.objects.all() # get 获取某一条数据 对象 获取不到或者多个就报错
# ret = models.Person.objects.get(name='alex') # filter 获取满足条件的所有对象 QuerySet 对象列表
# ret = models.Person.objects.filter(name='alex') # exclude 获取不满足条件的所有对象 QuerySet 对象列表
ret = models.Person.objects.exclude(name='alex') # values 获取数据字段名称和值 QuerySet {}
# 不指定字段 查询所有字段的值
# 指定字段 查询指定字段的值
ret = models.Person.objects.filter(name='alex').values('pid', 'name') # 最后是以字典的形式显示 # values_list 获取数据字段的值 QuerySet (值,值) #最后是以元祖的形式显示
# 不指定字段 查询所有字段的值
# 指定字段 查询指定字段的值
# ret = models.Person.objects.filter(name='alex').values_list('pid', 'name') # order_by 排序 多个字段排序 - 降序排序
# ret = models.Person.objects.order_by('age','-pid' )
# print(ret) # reverse 在已经排好序的基础在反转
# ret = models.Person.objects.all()
# print(ret)
# ret = ret.reverse()
# print(ret) # distinct() 去重
# ret = models.Person.objects.values_list('name').distinct()
# print(ret) # count 计数
ret = models.Person.objects.filter(name='alex').count() # first last 取对象列表中的第一个 最后一个
ret = models.Person.objects.filter(pid=1000).first()
# ret = models.Person.objects.all().last() # exists() 查询结果是否存在
ret = models.Person.objects.filter(pid=100).exists()
print(ret) """

单表的双下划线方法

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")

import django

django.setup()

from app01 import models

ret = models.Person.objects.filter(pk__gt=100)    #查询的是ID大于100的人

ret = models.Person.objects.filter(pk__lt=103)    查询的是ID小于103的人

ret = models.Person.objects.filter(pk__gte=100)   查询的是ID大于等于100的人

ret = models.Person.objects.filter(pk__lte=103)   查询的是ID小于等于103的人

ret = models.Person.objects.filter(pk__in=[100,103])   查询的是ID是【100,103】的人

ret = models.Person.objects.filter(pk__range=[100,103])  查询的是ID在100-103范围内人

ret = models.Person.objects.filter(name__contains='L')  查询的是name字段中包含L的人

ret = models.Person.objects.filter(name__icontains='L')  查询的是name字段中包含大小写L的人

ret = models.Person.objects.filter(name__startswith='x')   查询的是name字段中以x开头的人

ret = models.Person.objects.filter(name__istartswith='X')  查询的是name字段中以大小写x开头的人

ret = models.Person.objects.filter(name__endswith='x')    查询的是以什么结尾的
ret = models.Person.objects.filter(name__iendswith='X') 不区分大小写 ret = models.Person.objects.filter(birth__year='2019') 可以查询出生年份是2019年的人 ret = models.Person.objects.filter(age__isnull=False) print(ret) 可以判断某个字段是不是空

外键操作

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django django.setup() #首先导入脚本 from app01 import models book_obj = models.Book.objects.get(pk=3)
print(book_obj.publisher) # 关联的对象
print(book_obj.publisher_id) # 关联的对象id 不指定related_name 关联表的表名小写_set
ret = pub_obj.book_set.all() 指定related_name='books'
ret = pub_obj.books.all() 基于字段的查询
ret = models.Book.objects.filter(publisher__name='**出版社') #查出出版社名称是**出版社的书 不指定related_name
ret = models.Publisher.objects.filter(book__title='**的故事') 指定related_name = 'books'
ret = models.Publisher.objects.filter(books__title='**的故事') 指定related_query_name='book' 再改完名字的基础上,再一次改名字
ret = models.Publisher.objects.filter(book__title='**的故事') pub_obj.books.remove(models.Book.objects.get(pk=3)) #表示删除ID为3的书与出版社的关系 pub_obj.books.clear() #清空所有图书与数的关系 pub_obj.books.create(title='qqqq') 创建出版社对象与title=“qqqq”的书的关系

多对多操作

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django django.setup() # 导入测试脚本 from app01 import models author_obj = models.Author.objects.get(pk=2) set() 设置多对多关系 既能设置[id ]也能设置 [ 对象 ]
author_obj.books.set([2,4]) 设置作者ID为2的与书的ID为2和4的关系
author_obj.books.set(models.Book.objects.filter(id__in=[1,3])) 设置作者ID为2与书的ID为1和3的关系
反向设置
book_obj.author_set.set([3]) add() 添加多对多关系
author_obj.books.add(1,2)
author_obj.books.add(models.Book.objects.get(pk=4)) remove() 删除多对多关系
author_obj.books.remove(1,2)
author_obj.books.remove(models.Book.objects.get(pk=4)) clear() 清空所有多对多关系
author_obj.books.clear() create 创建多对多关系
author_obj.books.create(title='****',publisher_id=1)
book_obj.author_set.create(name='xxx')

聚合和分组

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django
django.setup() 导入脚本进行测试 from app01 import models
from django.db.models import Max, Min, Sum, Count, Avg 导入聚合函数 aggregate()是QuerySet 的一个终止子句 表示聚合的意思
ret = models.Book.objects.all().aggregate(max=Max('price'), min=Min('price')) #所有图书中最高价格与最低价格的书 ret = models.Book.objects.filter(publisher__name='**出版社').aggregate(max=Max('price'), min=Min('price')) 筛选出**出版社出版的书的最高与最低价格的书 统计每一本书的作者个数
ret = models.Book.objects.annotate(Count('author')) 统计出每个出版社买的最便宜的书的价格
ret = models.Publisher.objects.annotate(Min('book__price')).values()
ret = models.Book.objects.values('publisher__name').annotate(Min('price'))
ret = models.Book.objects.values('publisher').annotate(min=Min('price')).values('publisher__name', 'min', )
 统计不止一个作者的图书
ret = models.Book.objects.annotate(count=Count('author')).filter(count__gt=1)
 根据一本图书作者数量的多少对查询集 QuerySet进行排序
ret = models.Book.objects.annotate(count=Count('author')).order_by('-count')
查询各个作者出的书的总价格
ret = models.Author.objects.annotate(Sum('books__price')).values()

F和Q

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django django.setup() #导入脚本进行测试 from app01 import models
from django.db.models import F, Q F比较两个字段之间的关系
ret =models.Book.objects.filter(sale__gt=F('kucun')).values() # 查询销量大于库存的图书
for i in ret:
print(i)
#更新销量是原来的两倍
models.Book.objects.all().update(sale=F('sale') * 2) #Q可以同时查询多个条件出来
~Q表示非的意思
| 表示或的意思
&表示and的意思
ret = models.Book.objects.filter(~Q(Q(id__lt=2) | Q(id__gt=4)) & Q(id__gt=3))

事务

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django django.setup() from app01 import models
from django.db import transaction 导入事务 try:
with transaction.atomic(): 原子性操作,一个成功都成功,一个不成功都不成功
     models.User.objexts.filter(id__gt=3).select_for_update()
models.Publisher.objects.create(name='**出版社')
# models.Publisher.objects.create(name='**出版社')
# models.Publisher.objects.create(name='**出版社')
# models.Publisher.objects.create(name='**出版社')
except Exception as e:
print(e)

ORM查询相关的操作的更多相关文章

  1. 自己没有记住的一点小知识(ORM查询相关)

    一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...

  2. ORM查询相关

    一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...

  3. 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)

    一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段   示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...

  4. Django的ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  5. Django之ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  6. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  7. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

  8. Django ORM 那些相关操作

    Django ORM 那些相关操作 一般操作 必知必会13条 <> all(): #查询所有的结果 <> filter(**kwargs) # 它包含了与所给筛选条件相匹配的对 ...

  9. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

随机推荐

  1. MYSQL中的where ‘1=1‘ 探讨

    在学习MySQL时候,关于MySQL注入的例子 首先针对以下代码,实现的是关于sql注入时,一个普通登录所产生的的问题 package com.java.lesson02; import com.ja ...

  2. 【漫话DevOps】What is DevOps?

    最近几年"DevOps"这个关键词经常出现在项目开发当中,特别是随着微服务/容器/cloud在项目中的大范围应用,你不想知道都很难.作为一个伴随CI/CD到DevOps一路走来的工 ...

  3. mysql修改默认数据存储路径

    1.先关闭mysql服务 可cmd--services.msc进入关闭服务 或cmd命令输入net stop mysql57关闭服务 2.进入C:\ProgramData\MySQL\MySQL Se ...

  4. 刀哥之指纹识别biometrics

    指纹识别 - 生物识别 简介 iPhone 5S 开始支持 iOS 8.0 开放了 Touch ID 的接口 代码准备 - (void)touchesBegan:(NSSet *)touches wi ...

  5. spyder如何切换python虚拟环境?

    2020/5/29 在anaconda下创建了很多个python虚拟环境,现在我想使用 spyder 运行python程序, 并且使用其中某一个虚拟环境,方法如下: 首先要知道 Anaconda自带的 ...

  6. 使用阿里云OSS的服务端签名后直传功能

    网站一般都会有上传功能,而对象存储服务oss是一个很好的选择.可以快速的搭建起自己的上传文件功能. 该文章以使用阿里云的OSS功能为例,记录如何在客户端使用阿里云的对象存储服务. 服务端签名后直传 背 ...

  7. 硬核看房利器——Web 全景的实现

    作者:凹凸曼 - EC 疫情期间,打破社交距离限制的交互模式被推向前台,为不少行业的传统交易提供了想象的空间. 疫情时期,房地产租售业受到的冲击无疑是巨大的,由于人口流动的限制,需求量大幅减少,无法现 ...

  8. 将lua编译进nginx

    1.先安装lua-jit,网上说也可以下载lua,不过lua-jit效率比较高,地址:http://luajit.org/download.html我下的是2.0.3版本的下载解压后,直接make & ...

  9. Burger King使用RayOnSpark进行基于实时情景特征的快餐食品推荐

    作者:Luyang Wang, Kai Huang, Jiao Wang, Shengsheng Huang, Jason Dai 基于深度学习的推荐模型已广泛应用于各种电商平台中,为用户提供推荐.目 ...

  10. windows下搭建ElasticSearch

      1.官网下载ElasticSearch,需要java环境支持       地址:https://www.elastic.co/products/elasticsearch   2.下载后解压到目录 ...