博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django ORM 最后操作
阅读量:4570 次
发布时间:2019-06-08

本文共 1976 字,大约阅读时间需要 6 分钟。

 

 

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)

    

 

转载于:https://www.cnblogs.com/zhaoweihang/p/9215299.html

你可能感兴趣的文章
Docker安装Nginx
查看>>
Usenet:P2P下载的替代方法
查看>>
POJ 2155 Matrix (D区段树)
查看>>
SQL Server中索引视图用法详解
查看>>
我的小前端 (1)—— 安卓机和ios机的区别
查看>>
andorid简易定位
查看>>
前端基础标签
查看>>
PHP常见的加密算法
查看>>
react-navigation 简介
查看>>
源码编译安装php7
查看>>
参数化查询与sqlparameter类的使用
查看>>
拷贝,集合,函数,enumerate,内置函数
查看>>
【待完善】资料记录
查看>>
2018-6-4-Python全栈开发day13-14-集合与函数
查看>>
Nginx与Tomcat集成
查看>>
Hadoop学习笔记: 安装配置Hadoop
查看>>
c/c++ 继承与多态 子类隐藏父类的同名非虚函数
查看>>
oracle安全应用角色例子
查看>>
记录Presto数据查询引擎的配置过程
查看>>
APP耗电量测试
查看>>