Django ORM 最后操作
F查询:代表2个字段之间的比较
from django.db.models import F
models.Book.objects.filter(price__gt=F('keep_price'))
也可以在F()后面进行运算,不过只能对数字
models.Book.objects.filter(price__gt=F('keep_price')+50)
如果对字符串进行修改操作呢?
要用到2个方法:
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.all().update(title=Concat(F('title'),Value(''(''),Value('第一'),(''),'')))
Q方法:
执行更复杂的语句,比如OR,
models.Book.objects.filter(Q(author__name='小仙女')|Q(author__name='小魔女'))
可以用AND和 | 操作符以及使用括号进行分组来编写任意复杂的Q对象,亦可以用~ 对Q对象进行取反操作
例如:查询作者名字是小仙女并且不是2018年出版的书的书名。
models.Book.objects.filter(Q(author__name='小仙女')& ~Q(publish_date__year=2018).values_list('title'))
查询时可以混用Q对象和关键字参数,用逗号分隔,取交集,但Q对象要在关键字参数前面。!!!!
查询出版年份是2018或2017年,书名带物语的书
models.Book.objects.filter(Q(publish_date__year=2018) | Q(pulisher_date__year=2017),title__contains='物语')
事务:和数据库事务一个概念,值是一起改变的,一方失败,则数据不变
固定格式如下:
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)
except Exception as e:
print(str(e))
update是对queryset对象进行操作,save是对对象进行操作,
update是更新某一字段,效率更高,save是更新所有字段,效率低一点
补充:
1.select_related 和 prefetch_related
1.select_related 利用SQL的JOIN来减少查询数据库的次数
2.prefetch_related 利用 Python 来做类似JOIN操作
3.ORM执行原生SQL的方法:
1. extra
查询书籍名称和出版时间(年月)
ret=models.Book.objects.all().extra(select={'zhangzhao':''Date_FORMAT(publish_date,'%%Y-%%M')''}).value('title','zhangzhao')
将书籍按年月归档
from django.db.models import Count
ret=models.Book.objects.extra(select={'zhangzhao':'DATE_FORMAT(publish_date,"%%Y-%%M")'})
2.类似pymysql方式
from django.db import connection
cursor=connection.cursor() ## cursor = connections['default'].cursor()
cursor.execute(""" SELECT * from app01_book where id=%s""",[1])
row=cursor.fetchone()
print(row)
Django ORM 最后操作的更多相关文章
- Django 2.0 学习(16):Django ORM 数据库操作(下)
Django ORM数据库操作(下) 一.增加表记录 对于表单有两种方式: # 方式一:实例化对象就是一条表记录france_obj = models.Student(name="海地&qu ...
- Django 2.0 学习(14):Django ORM 数据库操作(上)
Django ORM 数据库操作(上) ORM介绍 映射关系: 数据库表名 ---------->类名:数据库字段 ---------->类属性:数据库表一行数据 ----------&g ...
- Django ORM models操作
title: Django ORM models操作 tags: Django --- Django ORM models操作 Django ORM基本操作 一.数据库的创建及增删改查 1 使用类创建 ...
- Django ORM 数据库操作
比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 ...
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
- Django ORM哪些操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- Django ORM 事务操作
事务 把一些列的操作(步骤)当作一个事务 全部的步骤都成功才成功 经典例子:银行转账 代码实现: import os if name == 'main': os.environ.setdefault( ...
- django ORM数据库操作
5.使用Django的ORM详细步骤: 1. 自己动手创建数据库 create database 数据库名; 2. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库) # ...
- Django orm查询操作
基于双下划线查询切记!!!!正向查询按字段,反向查询按表名的小写 正向:在Book表里设置关联Obj表,Book------>Obj就是正向查询 反向:在Book表里设置关联Obj表,Obj-- ...
随机推荐
- IP及端口号
IP:代表一台机器 端口号:每一个程序都有一个端口号与之对应 一个域名对应一个虚拟主机
- MyBatis总结二:增删改查
上一篇讲述了MyBatis的快速入门,下面在此基础上进行增删改查的操作: 首先定义dao层的接口: package com.zy.dao; import com.zy.domain.User; imp ...
- day69-oracle 22-DBCA
只涉及到数据库的管理,不涉及到数据库的开发.不涉及到写SQL程序或者是写增删改查,不涉及到这些东西,也不涉及到事务. 你在安装oracle的时候它自动帮你创建一个数据库.
- REST API (更新文档)
Elasticsearch的更新文档API准许通过脚本操作来更新文档.更新操作从索引中获取文档,执行脚本,然后获得返回结果.它使用版本号来控制文档获取或者重建索引. 我们新建一个文档: 请求:PUT ...
- php学习笔记-php中的比较运算符
其中比较难懂的是==和=== ==是只比较两个变量的值,不仅仅是用于比较两个数是否相等,还可以比较int和string,不过会先转化string为int类型再比较,值相等则返回true,值不相等则返回 ...
- then方法
sendSMS(phoneNo).then(function(data) { var msg = (data && data['msg']) ? data['msg'] : '验证码已 ...
- 第一篇:Django基础
Django框架第一篇基础 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model ...
- 树莓派研究笔记(9)-- 树莓派SPI连接TFT屏幕
HDMI连接和树莓派专用连接的接口的屏幕都太贵了,为了节约成本,现在国内大多数还是TFT屏幕. 树莓派可以激活SPI接口,通过代码驱动TFT屏幕的显示.这样利用树莓派zero 打造小型的游戏平台可以大 ...
- 【IMOOC学习笔记】多种多样的App主界面Tab实现方法(四)
ViewPagerIndicator+ViewPager 要想使用ViewPagerIndicator,要使用到viewPagerlibrary开源库 top.xml <?xml version ...
- winform GDI基础(三)实现画笔
在程序窗口上使用鼠标画图 private Point pStart, pEnd; private bool isAllowDraw = false; private bool isOpenPen = ...