Django ORM 那些相关操作

一般操作

必知必会13条

  1. <> all(): #查询所有的结果
  2. <> filter(**kwargs) # 它包含了与所给筛选条件相匹配的对象
  3. <> get(**kwargs) #返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出异常
  4. <> exclude(**kwargs) #它包含了与所给筛选条件不匹配的对象。
  5. <> values(*field) :反回一个ValueQuerySet— 一个特殊的Queryset, 运行后得到的并不是一个系列model 的实例化对象, 而是一个可迭代的字典序列。
  6. <> values_list(*field):它与values()非常相似, 它返回的是一个元组序列, values 返回的是一个字典序列。
  7. <> order_by(*firld) 对查询结果排序
  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

返回QuerySet 对象的方法有

  1. all()
  2. filter()
  3. exclude()
  4. order_by()
  5. reverse()
  6. distinct()

返回具体对象的

  1. get()
  2. first()
  3. last()

返回布尔值的方法有:

  1. exists()

返回数字的方法有:

  1. count()

练习:单表查询之神奇的双下划线

  1. models.Tb1.objects.filter(id__lt=,id__gt=) #获取id大于1且小于10 的值。
  2.  
  3. models.Tb1.objectfilter(id__in=[,,]) #获取id等于11,, 的数据
  4.  
  5. models.Tb1.objects.exclude(id__in=[,,]) #not in
  6.  
  7. models.Tb1.objects.filter(name__contains =“ven”) #获取name字段包含"ven"
  8.  
  9. models.Tb1.objects.filter(name__icontains="ven") #icontains 大小写不敏感
  10.  
  11. models.Tb1.objects.filter(id__range=[,]) #id 范围是1到3的, 等价于SQL的bettwen and
  12.  
  13. 类似的还有:startswithistartswith, endswith, iendswith 
  14.  
  15. date字段还可以:
  16. models.Class.objects.filter(first_day__year=)

ForeignKey 操作

正向查找

对象查找

对象.关联字段.字段

示例:

  1. book_obj = models.Book.objects.first() #第一本书对象
  2. print(book_obj.publisher) #得到这本书关联的出版社对象
  3. printbook_obj.publisher.name #得到出版社对象的名称

字段查找(跨表)

语法:

关联字段__字段

示例:

  1. print(models.Book.objects.values_list("publisher__name") #得到的 是所有书的出版社的名字 为一个元组的列表)

反向操作

对象查找

语法:

obj.表名__set

示例:

  1. publisher_obj = models.Publisher.objects.first() #找到第一个出版社对象
  2. books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有的书。
  3.  
  4. titles = books.values_list("title") #找到第一个出版社出版的所有书的书名

字段查找

语法:

表名__字段

示例:

  1. titles = models.Publisher.objects.values_list("book__title") #找到所有出版社出版的书名

manyToManyField

class RelatedManager

"关联管理器" 是在一对多或者多对多的关联上下文中使用的管理器。

它存在于下面两种情况:

  1:外键关系的方向查询

  2:多对多关联关系

简单来说,就是当点后面的对象,可能存在多个的时候,就可以使用以下方法。

方法

create()

创建一个新的对象, 保存对象 ,并将它添加到关联对象集之中, 返回新创建的对象。

  1. import datetime
  2. models.Author.objects.first().book_set.create(title="番茄物语"publisher_date=datetime.date.today())

add()

把指定的model对象添加到关联对象集中。

添加对象

  1. author_objs = models.Author.objects.filter(id__il=) #查找id小于3 的 作者
  2.  
  3. models.Book.objects.first().authors.add(*author_objs) # 查找第一本书的作者 并把上面查找的id 小于3 的作者添加到这个作者里面。

添加id

  1. models.Book.objects.first().authors.add(*[,])

set()

更新model对象的关联对象。

  1. book_obj = models.BOOK.objects.first()
  2. book_obj.authors.set([,])

remove()

从关联对象集中移除执行的model对象

  1. book_obj = models.Book.objects.first()
  2. book_obj.authors.remove()

clear()

从关联对象集中移除一切对象。

  1. book_obj = models.Book.objects.first()
  2. book_obj.authors.clear()

注意:

对于ForeignKey对象,clear()和remove() 方法仅在null =True时存在。

举例个例子:

Foreignkey 字段没设置 null=True 时,

  1. class Book(models.model):
  2. title = models.CharField(max_length=)
  3. publisher = models.ForeignKey(to = Publisher)

没有clear()和remove()方法:

  1. models.Publiser.objects.first().book_set.clear()
  2. Traceback (most recent call last):
  3. File "<input>", line , in <module>
  4. AttributeError: 'RelatedManager' object has no attribute 'clear'

当ForeignKey 字段设置null=True 时,

  1. class Book(models.Model):
  2. name = models.CharField(max_length=)
  3. publisher = models.ForeignKey(to=Class, null=True)

此时就有clear() 和remove()方法:

  1. models.Publisher.objects.first().book_set.clear()

注意:

1.对于所有类型的关联字段, add(),create(),remove()和clear(),set()都会马上更新数据库。

换句话说 在关联的任何一端, 都不需要在调用save()方法。

聚合查询和分组查询

聚合

aggregate()QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。

键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

用到的内置函数:

  1. from django.db.models import Avg,SumMax,Min,Count

示例:

  1. from django.db.models import Avg,Sum,Max,Min,Count
  2.  
  3. models.Book.objects.all().arggreate(Avg("price"))
  4.  
  5. #{price__avg":13.233333}

如果你想要为聚合值指定一个名称, 可以向聚合子句提供它。

  1. models.Book.objects.aggregate(average_price=Avg('price'))
  2. {'average_price': 13.233333}

如果你希望生成不止一个聚合, 你可以向arggreate()子句中添加另一个参数, 所以, 如果你也想知道所有图书价格的最大值和最小值,可以这样查询:

  1. models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))
  2. {'price__avg': 13.233333, 'price__max': Decimal('19.90'), 'price__min': Decimal('9.90')}

分组

先复习一下SQL 语句的分组。

假设现在又一张公司职员表:

若是使用原生的SQL 语句,按照部们分组求平均工资:

  1. select dept, AVG(salary) from employee group by dept;

ORM 查询:

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

连表查询分组:

SQL 查询:

  1. select dept.name,AVG(salary) from employee inner join dept on (employee.dept_id=dept.id) group by dept_id;

ORM 查询:

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

F查询和Q 查询

F查询

在上面所有的例子中, 我们构造的过滤器都只是将字段值与某个常量做比较,如果我们要对两个字段的值做比较, 那么该怎么做?

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

示例1:

查询评论数大于收藏的书籍

  1. from djang.db.models import F
  2. models.Book.objects.filter(commnet_num__gt=F('keep_num'))

Django 支持F()对象之间及F()对象和常数之间的加减乘除和取模的操作。

  1. models.Book.Objects.filter(commnet_num__lt=F('keep_num')*)

修改操作也可以使用F 函数, 比如将每一本数的价格提高30元

  1. models.Book.objects.all().update(price=F("price")+)

引申:

如果要修改char字段怎么办?

如:把所有商品名称后面加上一个新款

  1. from django.db.models import F
  2. from django.db.models.functions import Concat
  3. from django.db.models import Value
  4.  
  5. models.Product.objects.update(name=Concat(F("name"),Value("新款“)))

Q查询

filter()等方法中的关键字参数下旬都是一起进行的 , 相当于“and”.如果需要执行更复杂的查询, 例如(‘or’语句),我们可以使用Q 对象。

例如查询:

卖出数大于100 并且价格小于100快的

  1. models.Product.objects.filter(maichu__gt=,price__lt=)

可以组合&  和 | 操作符 以及使用括号进行分组来编写任意复杂的Q 对象。同时Q对象可以使用~操作符取反,这允许组合正常的查询和取反(NOT)查询。

卖出数大于100或者价格小于100块的呢  应该如下表示:

  1. from django.db.models import Q
  2.  
  3. ret = models.Puduct.objects.filter(Q(maichu__gt=)|Q(price__lt=))

查询库存数是100 并且卖出数不是0 的产品  : 不 是  用~

  1. ret = models.Product.objects.filter(Q(kuncun=) & ~Q(maichu=))

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

  1. ret= models.Product.objects.filter(Q(kucun__gt=),name__cotains="新款”)

事务

举例:

买一本 书,那么在数据库层面要做的事

1:创建一条订单数据

2:去产品表,卖出去数+1,库存数-1.

这就是一种事务

  1. from django.db.models import F
  2. from django.db import transaction
  3.  
  4. try:
  5. with transaction.atmoic(): ##开启事务处理
  6.  
  7. models.Order.objects.create(num="",product_id=,count=) #创建一个提单数据
  8. models.Product.objects.filter(id=).update(kucun=F("kucun")-,maichu=F("maichu")+)
  9.       #产品表里卖出+1, 库存-1
  10. except Exception as e:
  11. print(e)

Django 终端打印SQL语句

在Django项目的settings.py文件中在最后复制粘贴如下代码:

  1. LOGGING = {
  2. 'version': ,
  3. 'disable_existing_loggers': False,
  4. 'handlers': {
  5. 'console':{
  6. 'level':'DEBUG',
  7. 'class':'logging.StreamHandler',
  8. },
  9. },
  10. 'loggers': {
  11. 'django.db.backends': {
  12. 'handlers': ['console'],
  13. 'propagate': True,
  14. 'level':'DEBUG',
  15. },
  16. }
  17. }

即为你的Django项目配置上一个名为django.db.backends的logger实例即可查看翻译后的SQL语句。

在Python脚本中调用Django 环境

  1. import os
  2.  
  3. if __name__ == '__main__':
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") #括号里可跟距项目下的manage.py文件
  5. import django
  6. django.setup()
  7.  
  8. from app01 import models
  9.  
  10. books = models.Book.objects.all()
  11. print(books)

Django ORM 那些相关操作的更多相关文章

  1. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  2. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  3. 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)

    一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段   示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...

  4. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  5. Django的ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  6. Django之ORM那些相关操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  7. Django框架之ORM的相关操作(一)

    一.一般操作 from django.db import models import datetime # Create your models here. class Author(models.M ...

  8. Django - orm外键操作

    1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...

  9. Django框架之ORM的相关操作之分页(六)

    分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...

随机推荐

  1. 【BZOJ2476】战场的数目 矩阵乘法

    [BZOJ2476]战场的数目 Description Input 输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长.p=0表示输 ...

  2. c++中的基本知识点

    1 class和struct的区别和联系 在c++中,class和struct只有一点不同,它们是可以完全替代使用的.唯一的不同在于,class中的成员默认是private的,而struct中默认是p ...

  3. Wix Burn运行64位dism.exe的问题

    主要的问题是Burn是一个32位程序,在64位机器上它启动的进程都会被重定向到wow64目录下,也就是说它运行的dism.exe最终会是32位的.解决的方法就是用wix提供的QtExec64CmdLi ...

  4. 【linux】自动删除7天前的文件

    下面的脚本是删除/home目录下7天前的文件 #!/bin/bash -exec rm -f {} \; 把这个脚本保存在/tmp目录下,命名为:clearfile.sh 加入计划任务 crontab ...

  5. CentOs7 配置nfs 系统

    一.介绍 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,功能是让客户端通过网络访问不同主机上磁盘里的数据,主要用在类Unix系统上实现文件共享 ...

  6. 现代JS中的流程控制:详解Callbacks 、Promises 、Async/Await

    JavaScript经常声称是_异步_.那是什么意思?它如何影响发展?近年来这种方法有何变化? 请思考以下代码: result1 = doSomething1(); result2 = doSomet ...

  7. jzyz集训 0612

    今天闵神找的题,题目质量还算不错,就是有些偏套路了. 第一题:定义一个排列是合法当且仅当这个排列中不存在大于2的循环节,询问有多少长度为n的排列是合法的且B排列是该排列的子序列. 恩...这题目其实不 ...

  8. MSSQL2005外网IP的1433端口开启方法

    打开SQL Server Configuration Manager,在SQL server配置管理器展开SQL server 2005网络配置-->SQLEXPRESS 的协议-->双击 ...

  9. 4.7 希尔(shell)排序法

    4-7 ShellSort.c #include <stdio.h> #include "4-1 CreateData.c" //生成随机数的函数 #define AR ...

  10. zabbix性能优化等

    摘自: http://blog.sina.com.cn/s/blog_4cbf97060101fcfw.html 非常好的一篇,值得有用