热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ORM查询相关的操作

必知必会13条importosos.environ.setdefault(DJANGO_SETTINGS_MODULE,orm_practice.settings)impo



必知必会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)


 





推荐阅读
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 使用lambda表达式排序Collections.sort(temp,(Stringa,Stringb)-{returnb.compareTo(a);});Collections ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
author-avatar
宝宝彪恒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有