ORM操作

https://www.cnblogs.com/maple-shaw/articles/9403501.html

一、一般操作

  1. 必知必会13条 

 <1> all():                 查询所有结果

 <2> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

 <3> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

 <4> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象

 <5> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

 <6> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

 <7> order_by(*field):      对查询结果排序

 <8> reverse():             对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。

 <9> distinct():            从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)

 <10> count():              返回数据库中匹配查询(QuerySet)的对象数量。

 <11> first():              返回第一条记录

 <12> last():               返回最后一条记录

 <13> exists():             如果QuerySet包含数据,就返回True,否则返回False

必知必会13条

  2. 单表查询之神奇的双下划线

    1) id__gt  id__gte  id__lt  id__lte  id__in  id_range=[1,5]

    2) name__contains  name__icontains  name__startswith  name__istartswith  name__endswith  name__iendswith

    3) date字段  birthday__year  birthday__month  birthday__day

    4) __exact   __iexact #精确等于like'aaa'

    5) __regex  __iregex

二、ForeignKey操作

   1.正向查找

      1) 对象查找跨表

         book_obj.publisher

         book_obj.publisher.name

       2) 字段查

         models.Book.objects.values_list("publisher__name")    

   2.反向操作

      对象查找: obj.表名_set (设置了related_name 按此查询) 拿到管理的对象

      字段查找:表名__字段

三、ManyToManyField操作

      通过表与表之间的管理对象进行相关的骚操作,针对一对多、多对多的操作:

      create()  

      add()

      set()

      remove()

      clear()

      ForeignKey字段没设置null=True时,没有clear()和remove()方法

      ForeignKey字段设置null=True时,有clear()和remove()方法

      对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调save()方法

四、聚合查询和分组查询

  1.聚合查询

    models.Book.objects.aggregate(average_price=Avg('price'))

   2.分组查询(基本思路先查出分组对象,然后调用annotate进行分组计算)

    1)

    from django.db.models import Avg
    Employee.objects.values("dept").annotate(avg=Avg("salary").values("dept", "avg")
    
    2)
    
    from django.db.models import Avg
    models.Dept.objects.annotate(avg=Avg("employee__salary")).values("name", "avg")

五、F查询和Q查询

       1 F查询

        F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

       2 Q查询

        你需要执行更复杂的查询(例如OR语句)

        Q(id=1) |Q(id>3)  &   ~

        注意点:查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,关键字参数必须位于所有关键字参数的前面。

       3 字符串拼接

    

六、事务  transaction

 from django.db import transaction   

  with transaction.atomic():

import os

if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup() import datetime
from app01 import models try:
from django.db import transaction
with transaction.atomic():
new_publisher = models.Publisher.objects.create(name="火星出版社")
models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10) # 指定一个不存在的出版社id
except Exception as e:
print(str(e))

例子知晓

七、Django终端打印SQL语句

  

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}

八、在Python脚本中调用Django环境

import os

if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup() from app01 import models books = models.Book.objects.all()
print(books)

九、其他

  Django ORM执行原生SQL

  QuerySet方法大全

python全栈开发day68-ORM操作:一般操作、ForeignKey操作、ManyToManyField、聚合查询和分组查询、F查询和Q查询等的更多相关文章

  1. python全栈开发day48-jqurey自定义动画,jQuery属性操作,jQuery的文档操作,jQuery中的ajax

    一.昨日内容回顾 1.jQuery初识 1).使用jQuery而非JS的六大理由 2).jQuery对象和js对象转换 3).jQuery的两大特点 4).jQuery的入口函数三大写法 5).jQu ...

  2. python 全栈开发,Day71(模型层-单表操作)

    昨日内容回顾 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} {% ...

  3. python全栈开发day60-django_app ORM 完整登录案例

    day60 内容回顾: 1. HTTP协议: 1.请求(浏览器发给服务端的消息——request) 请求方法 URL 协议版本\r\n k1:v1\r\n k2:v2\r\n \r\n 请求体 —— ...

  4. python 全栈开发:str(字符串)常用方法操作 、for 有限循环以及if 循环

    str(字符串)常用方法操作: 首字母大写: s = 'mylovepython' s1 = s.capitalize() print(s1) 输出: Mylovepython 单行多字符串首字母大写 ...

  5. Python全栈开发:list、元祖常用方法操作

    列表[] 索引与切片#例题#li = ['yijiajun',[1,3,5,7,9],'zhangliang','zhaoritian','sunwukong'] # #例子1 找出列表中索引为0的元 ...

  6. Python全栈开发记录_第二篇(文件操作及三级菜单栏增删改查)

    python3文件读写操作(本篇代码大约100行) f = open(xxx.txt, "r", encoding="utf-8") 不写“r”(只读)默认是只 ...

  7. Python全栈开发 列表, 元组 数据类型知识运用及操作 range知识

    一.列表 1.什么是列表? 列表是一个可变类型,由  [ ] 表示,每一项元素用逗号隔开.列表能够装大量的数据,可以装对象的对象. 2.列表的索引和切片. 列表和字符串一样,也有索引和切片.只不过列表 ...

  8. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  9. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  10. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

随机推荐

  1. VS2013中如何解决error C4996: 'fopen'问题

    今天编写控制台应用程序时出现如下错误 error C4996: 'fopen': This function or variable may be unsafe. Consider using fop ...

  2. QT 出现信号槽不触发的问题

    主要有以下三点: 1)槽函数未声明为 slots 类型, 信号函数未声明为 signals所致 2)槽函数和信号函数的参数不一致所致 3)connect关联时失败

  3. DALSA相机开发--修改参数

    DALSA gige相机有两种方式可以获取到相机相关参数,一个是读取相机里面的xml文件:另外一个是读取相对应的寄存器的值. 对于修改寄存器的值,有两个相应的函数: 1)GevSetFeatureVa ...

  4. 持续集成之②:整合jenkins与代码质量管理平台Sonar并实现构建失败邮件通知

    持续集成之②:整合jenkins与代码质量管理平台Sonar并实现构建失败邮件通知 一:Sonar是什么?Sonar 是一个用于代码质量管理的开放平台,通过插件机制,Sonar 可以集成不同的测试工具 ...

  5. mysql 命令行常用命令

    1.显示数据库列表.  show databases; 2.显示库中的数据表:  use mysql; show tables; 3.显示数据表的结构:  describe 表名; 4.建库:  cr ...

  6. appium+java (六) 手机chrome浏览器操作

    一.前言 早之前写过一段时间的appium for native app(即原生app脚本),但尴尬的是从未写过类似的文章,后期有时间我会陆续接着写,近一阶段有时间又把appium捡起来了,由于公司产 ...

  7. 搭建python的虚拟环境

    文章连接:https://www.cnblogs.com/zlsgh/p/8485848.html ubuntu系统下Python虚拟环境的安装和使用        前言:进行python项目开发的时 ...

  8. 连接mysql(建表和删表)

    from sqlalchemy.ext.declarative import declarative_base##拿到父类from sqlalchemy import Column##拿到字段from ...

  9. Python-Numpy数组计算

    一.NumPy:数组计算 1.NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础.2.NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环 ...

  10. Python-Pool类

    目录: multiprocessing模块 Pool类 apply apply_async map close terminate join 进程实例 multiprocessing模块 如果你打算编 ...