Django ORM 那些相关操作
Django ORM 那些相关操作
一般操作
必知必会13条
<> all(): #查询所有的结果
<> filter(**kwargs) # 它包含了与所给筛选条件相匹配的对象
<> get(**kwargs) #返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出异常
<> exclude(**kwargs) #它包含了与所给筛选条件不匹配的对象。
<> values(*field) :反回一个ValueQuerySet— 一个特殊的Queryset, 运行后得到的并不是一个系列model 的实例化对象, 而是一个可迭代的字典序列。
<> values_list(*field):它与values()非常相似, 它返回的是一个元组序列, values 返回的是一个字典序列。
<> order_by(*firld) 对查询结果排序
<> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的Queryset 上调用(在model类的Meta中指定ordering或调用order_by()方法)。
<> distinct(); 从返回结果中提出重复记录(如果你查询跨越多个表, 可能在计算QuerySet时 得到重复的结果, 此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
<> count() :返回数据库中匹配查询(QuerySet)的对象数量
<> first(): 返回第一条记录
<> last(): 返回最后一条记录
<> exists(): 如果QuerySet 包含数据, 就返回True,否则返回False
返回QuerySet 对象的方法有
all()
filter()
exclude()
order_by()
reverse()
distinct()
返回具体对象的
get()
first()
last()
返回布尔值的方法有:
exists()
返回数字的方法有:
count()
练习:单表查询之神奇的双下划线
models.Tb1.objects.filter(id__lt=,id__gt=) #获取id大于1且小于10 的值。 models.Tb1.object。filter(id__in=[,,]) #获取id等于11,, 的数据 models.Tb1.objects.exclude(id__in=[,,]) #not in models.Tb1.objects.filter(name__contains =“ven”) #获取name字段包含"ven" models.Tb1.objects.filter(name__icontains="ven") #icontains 大小写不敏感 models.Tb1.objects.filter(id__range=[,]) #id 范围是1到3的, 等价于SQL的bettwen and 类似的还有:startswith,istartswith, endswith, iendswith date字段还可以:
models.Class.objects.filter(first_day__year=)
ForeignKey 操作
正向查找
对象查找
对象.关联字段.字段
示例:
book_obj = models.Book.objects.first() #第一本书对象
print(book_obj.publisher) #得到这本书关联的出版社对象
print(book_obj.publisher.name) #得到出版社对象的名称
字段查找(跨表)
语法:
关联字段__字段
示例:
print(models.Book.objects.values_list("publisher__name") #得到的 是所有书的出版社的名字 为一个元组的列表)
反向操作
对象查找
语法:
obj.表名__set
示例:
publisher_obj = models.Publisher.objects.first() #找到第一个出版社对象
books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有的书。 titles = books.values_list("title") #找到第一个出版社出版的所有书的书名
字段查找
语法:
表名__字段
示例:
titles = models.Publisher.objects.values_list("book__title") #找到所有出版社出版的书名
manyToManyField
class RelatedManager
"关联管理器" 是在一对多或者多对多的关联上下文中使用的管理器。
它存在于下面两种情况:
1:外键关系的方向查询
2:多对多关联关系
简单来说,就是当点后面的对象,可能存在多个的时候,就可以使用以下方法。
方法
create()
创建一个新的对象, 保存对象 ,并将它添加到关联对象集之中, 返回新创建的对象。
import datetime
models.Author.objects.first().book_set.create(title="番茄物语",publisher_date=datetime.date.today())
add()
把指定的model对象添加到关联对象集中。
添加对象
author_objs = models.Author.objects.filter(id__il=) #查找id小于3 的 作者 models.Book.objects.first().authors.add(*author_objs) # 查找第一本书的作者 并把上面查找的id 小于3 的作者添加到这个作者里面。
添加id
models.Book.objects.first().authors.add(*[,])
set()
更新model对象的关联对象。
book_obj = models.BOOK.objects.first()
book_obj.authors.set([,])
remove()
从关联对象集中移除执行的model对象
book_obj = models.Book.objects.first()
book_obj.authors.remove()
clear()
从关联对象集中移除一切对象。
book_obj = models.Book.objects.first()
book_obj.authors.clear()
注意:
对于ForeignKey对象,clear()和remove() 方法仅在null =True时存在。
举例个例子:
Foreignkey 字段没设置 null=True 时,
class Book(models.model):
title = models.CharField(max_length=)
publisher = models.ForeignKey(to = Publisher)
没有clear()和remove()方法:
models.Publiser.objects.first().book_set.clear()
Traceback (most recent call last):
File "<input>", line , in <module>
AttributeError: 'RelatedManager' object has no attribute 'clear'
当ForeignKey 字段设置null=True 时,
class Book(models.Model):
name = models.CharField(max_length=)
publisher = models.ForeignKey(to=Class, null=True)
此时就有clear() 和remove()方法:
models.Publisher.objects.first().book_set.clear()
注意:
1.对于所有类型的关联字段, add(),create(),remove()和clear(),set()都会马上更新数据库。
换句话说 在关联的任何一端, 都不需要在调用save()方法。
聚合查询和分组查询
聚合
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。
用到的内置函数:
from django.db.models import Avg,Sum,Max,Min,Count
示例:
from django.db.models import Avg,Sum,Max,Min,Count models.Book.objects.all().arggreate(Avg("price")) #{price__avg":13.233333}
如果你想要为聚合值指定一个名称, 可以向聚合子句提供它。
models.Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 13.233333}
如果你希望生成不止一个聚合, 你可以向arggreate()子句中添加另一个参数, 所以, 如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))
{'price__avg': 13.233333, 'price__max': Decimal('19.90'), 'price__min': Decimal('9.90')}
分组
先复习一下SQL 语句的分组。
假设现在又一张公司职员表:
若是使用原生的SQL 语句,按照部们分组求平均工资:
select dept, AVG(salary) from employee group by dept;
ORM 查询:
from django.db.models import Avg
Employee.objects.values("dept").annotate(avg=Avg("salary").values(dept, "avg")
连表查询分组:
SQL 查询:
select dept.name,AVG(salary) from employee inner join dept on (employee.dept_id=dept.id) group by dept_id;
ORM 查询:
from django.db.models import Avg models.Dept.objects.annotate(avg=Avg("employee__salary")).values("name","avg")
F查询和Q 查询
F查询
在上面所有的例子中, 我们构造的过滤器都只是将字段值与某个常量做比较,如果我们要对两个字段的值做比较, 那么该怎么做?
Djangot提供F()来做这样的比较。 F()的实例可以在查询中引用字段, 来比较同一个model实例中两个不同字段的值。
示例1:
查询评论数大于收藏的书籍
from djang.db.models import F
models.Book.objects.filter(commnet_num__gt=F('keep_num'))
Django 支持F()对象之间及F()对象和常数之间的加减乘除和取模的操作。
models.Book.Objects.filter(commnet_num__lt=F('keep_num')*)
修改操作也可以使用F 函数, 比如将每一本数的价格提高30元
models.Book.objects.all().update(price=F("price")+)
引申:
如果要修改char字段怎么办?
如:把所有商品名称后面加上一个新款
from django.db.models import F
from django.db.models.functions import Concat
from django.db.models import Value models.Product.objects.update(name=Concat(F("name"),Value("新款“)))
Q查询
filter()等方法中的关键字参数下旬都是一起进行的 , 相当于“and”.如果需要执行更复杂的查询, 例如(‘or’语句),我们可以使用Q 对象。
例如查询:
卖出数大于100 并且价格小于100快的
models.Product.objects.filter(maichu__gt=,price__lt=)
可以组合& 和 | 操作符 以及使用括号进行分组来编写任意复杂的Q 对象。同时Q对象可以使用~操作符取反,这允许组合正常的查询和取反(NOT)查询。
卖出数大于100或者价格小于100块的呢 应该如下表示:
from django.db.models import Q ret = models.Puduct.objects.filter(Q(maichu__gt=)|Q(price__lt=))
查询库存数是100 并且卖出数不是0 的产品 : 不 是 用~
ret = models.Product.objects.filter(Q(kuncun=) & ~Q(maichu=))
查询函数可以混合使用Q 对象和关键字参数, 所有提供给查询函数的参数(关键字参数或Q 对象)都将“and”在一起。 但是如果出现Q 对象, 它必须位于所有关键字参数的前面。
ret= models.Product.objects.filter(Q(kucun__gt=),name__cotains="新款”)
事务
举例:
买一本 书,那么在数据库层面要做的事
1:创建一条订单数据
2:去产品表,卖出去数+1,库存数-1.
这就是一种事务
from django.db.models import F
from django.db import transaction try:
with transaction.atmoic(): ##开启事务处理 models.Order.objects.create(num="",product_id=,count=) #创建一个提单数据
models.Product.objects.filter(id=).update(kucun=F("kucun")-,maichu=F("maichu")+)
#产品表里卖出+1, 库存-1
except Exception as e:
print(e)
Django 终端打印SQL语句
在Django项目的settings.py文件中在最后复制粘贴如下代码:
LOGGING = {
'version': ,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
即为你的Django项目配置上一个名为django.db.backends的logger实例即可查看翻译后的SQL语句。
在Python脚本中调用Django 环境
import os if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") #括号里可跟距项目下的manage.py文件
import django
django.setup() from app01 import models books = models.Book.objects.all()
print(books)
Django ORM 那些相关操作的更多相关文章
- Django ORM那些相关操作zi
Django ORM那些相关操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...
- Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 官网文档 常用的操作 <1> all() ...
- 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)
一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段 示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...
- Django ORM 多表操作
目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...
- Django的ORM那些相关操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...
- Django之ORM那些相关操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- Django框架之ORM的相关操作(一)
一.一般操作 from django.db import models import datetime # Create your models here. class Author(models.M ...
- Django - orm外键操作
1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...
- Django框架之ORM的相关操作之分页(六)
分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...
随机推荐
- Asp.net MVC3中全局图片防盗链
怎么样在Asp.Net MVC3中做到全局图片防盗链?如果熟悉Asp.Net的页面生命周期,相信解决这个问题应该很容易.下面就演示一下如何去做? 一.首先是全局的,我们肯定要在Global.asax文 ...
- SQL中的四种连接方式
转自:http://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html 联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指 ...
- sql server单引号和双引号的区别
--当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔--当 SET QUOTED_IDENTIFIER 为 OFF(默认值)时,表达式中的文 ...
- 九度OJ 1014:排名 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8267 解决:2469 题目描述: 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分 ...
- 认识影片版本(CAM、TS、TC、DVD、HD、BD、TVRIP等)
许多朋友在下载电影的时候, 往往会被各种各样的版本标识弄糊涂,今天把各种版本的缩写收集在一起,希望对大家有所帮助 . 引用: 1.CAM(枪版) CAM 通常是用数码摄像机从电影院盗录.有时会使 ...
- Java多线程系列 基础篇06 synchronized(同步锁)
转载 http://www.cnblogs.com/paddix/ 作者:liuxiaopeng http://www.infoq.com/cn/articles/java-se-16-synchro ...
- AnkhSVN
安装和配置 签入签出问题 1.安装和配置 ①安装.(貌似默认的安装到C:\Program Files\AnkhSVN 2下,开始菜单也没快捷?) ②源代码管理器设置:打开vs2012,工具→选项→源代 ...
- 虚拟化技术及ip netns简介
虚拟化技术: Iass:infrastructure as a server 直接启动一个虚拟机,需要什么程序自己安装 Paas:platform as a servicce 启动一个虚拟机,并安装了 ...
- Centos7 安装lnmp
Centos7 安装lnmp 1.下载 wget http://soft.vpser.net/lnmp/lnmp1.5-full.tar.gz 2.解压 tar -zvxf lnmp1.5-full. ...
- js正则表达式(2)
找到以某个字符串开头的字符串 var myReg=/^(abc)/gim; 如果不加m,那么只找一行,而加了m可以找到每行中以该字符串开头的匹配文本. 如: abcsfsdfasd7890hklfah ...