1.基于对象的正向查询和反向查询

python---django中orm的使用(1)中也提到了正向和反向查找

表:一对多  书籍和出版社

class Book(models.Model):
title = models.CharField(max_length=)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
price=models.DecimalField(max_digits=,decimal_places=,default=)
def __str__(self):
return self.title

Book(多)

class Publisher(models.Model):
name = models.CharField(max_length=, verbose_name="名称")
address = models.CharField("地址", max_length=)
city = models.CharField('城市',max_length=)
state_province = models.CharField(max_length=)
country = models.CharField(max_length=)
website = models.URLField() class Meta:
verbose_name = '出版商'
verbose_name_plural = verbose_name def __str__(self):
return self.name

出版社(一)

正向查询:

from blog import models

def data_oper(req):
obj = models.Book.objects.filter(id=)[]
print(obj.publisher.name)
print(obj.publisher.city)
#正向查询,正常查找

反向查询:

from blog import models

def data_oper(req):
obj = models.Publisher.objects.filter(id=)[]
print(obj.book_set.all().values("title").distinct()) #_set是一个queryset集合
#反向查找,需要加上_set

上面正向反向都是基于对象的查询

2.双下划线(__)

双下划线(__)之单表条件查询
models.Book.objects.filter(id__lt=,id_gt=)获取id大于1,小于10的值   and

models.Book.objects.filter(id__in=[,,])获取id在11,,13中的数据
models.Book.objects.exclude(id__in=[,,]) not in models.Book.objects.exclude(title__contains="ven")  #contains类似于like模糊查询
models.Book.objects.exclude(title__icontains="ven") #icontains大小写不敏感
models.Book.objects.exclude(title__startwith="p")

models.Book.objects.filter(id__range=[,])获取在1-10之间的数据

......像:
字段名__isnull  判断字段是否为空
双下划线(__)之关联表条件查询

一对多,多对多没有区别

正向查询
models.Book.objects.filter(title="fsa").values("publish__name")
models.Book.objects.filter(publish__name="ffa出版社").values("title") 反向查询
models.Publish.objects.filter(book__title="XX书",book__id=).values("name").distinct()
....

关联查询,表之间需要有约束,外键,或者ManyToManyField。不能随便将无关表关联

3.聚合查询 aggregate(*args,**kwargs)和分组查询annotate(*args,**kwargs)(了解)

都属于聚合函数

聚合查询是在查询结果集上进行操作,只有一个结果

分组查询是根据条件对结果进行分组,然后对应每个分组,来进行操作,有多个结果

from django.db.models import Avg,Min,Sum,Max  #导入聚合函数

聚合查询aggregate

models.Book.objects.all().aggregate(Avg("price"),Min("price"),Max("price"))

分组查询annotate:分组条件放在values中

models.Book.objects.values("authors_name").annotate(Sum("price"))#对每个作者分组

4.F和Q查询(重点)

需求引入:

将所有商品价格增加20

models.Book.objects.all().update(price="price"+20)#错误,update不能对某列进行运算,可以直接赋值

解决方法,循环每个对象,单个修改,或者迭代,或者使用F

F查询:用来对某一列值进行操作

from django.db.models import F

def data_oper(req):
models.Book.objects.all().update(price=F("price")+)
     models.Book.objects.all().update(price=F("title")+'tt')

Q查询:

前面filter()条件过滤,要么是单字段,或者and

Q:可以封装关键字查询,多关键字查询

from django.db.models import Q

def data_oper(req):
models.Book.objects.filter(id=)[]
print(obj) #打印对象的地址(若无__str__) models.Book.objects.filter(Q(id=)|Q(title="php"))[] #or
print(obj) models.Book.objects.filter(Q(price_gt=) & (Q(id=)|Q(title="php")))[] #and和or
print(obj)
    
     models.Book.objects.filter(Q(price_gt=50) & (Q(id=3)|Q(title="php")),color="yellow")[0] 
      可以把Q对象和关键字查询一起使用,但是一定要把Q对象放在关键字查询前面

        结果是列表,包含所有结果

或者可以使用:

q =Q()
q.connector = "OR"
q.children.append(('id',))   #注意这里是元组
q.children.append(('title','php'))
models.Book.objects.filter(q)

python---django中orm的使用(2)的更多相关文章

  1. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  2. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  3. Django 中ORM 的使用

    一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...

  4. 关于Django中ORM数据库迁移的配置

    Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django. ...

  5. Django中ORM的使用

    Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...

  6. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  7. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  8. Django中ORM实际应用

    1. Django中ORM的使用 1. 手动新建一个数据库 2. 告诉Django连接哪个数据库 settings.py里面配置数据库连接信息: # 数据库相关的配置项 DATABASES = { ' ...

  9. Python Django中QQ邮箱授权码问题

    Python Django中QQ邮箱授权码问题 系统及软件版本如下: Ubuntu Kylin 16.04 Python 3.5.1 Django 1.9.7 PyCharm Community Ed ...

  10. Django中ORM的聚合索引

    Django中ORM的聚合索引   在Django中,聚合函数是通过aggregate方法实现的,aggregate方法返回的结果是一个字典 在使用时需要先导入模块from django.db.mod ...

随机推荐

  1. 从字节码层面,解析 Java 布尔型的实现原理

    最近在系统回顾学习 Java 虚拟机方面的知识,其中想到一个很有意思的问题:布尔型在虚拟机中到底是什么类型? 要想解答这个问题,我们看 JDK 的源码是无法解决源码的,我们必须深入到 class 文件 ...

  2. Maven构建项目速度太慢的解决办法

    问题描述 通过idea新建maven项目,参数设置好后,idea自动构建maven项目时,速度很慢. 参数设置如图: 执行时间如下图: Total time为8:49,花了将近十分钟时间. 连续尝试了 ...

  3. From today 2019.02.27

    HIT开设软件构造课程,需要在博客上分享记录学习体验,感觉还是挺好的. 以后会不定期更新一些关于学下java的笔记和实验相关的内容.

  4. C++学习之 类

    1.类规范 类声明:包括数据成员.成员函数(共有接口)的声明 类方法定义 C++程序员将接口(类)放在头文件中,将实现放在源代码文件中 类设计尽量将共有接口和实现细节分开,数据隐藏(将数据放在私有部分 ...

  5. ag使用需要注意的问题

    1.  set env 对比服务器标准配置,修改本地 /etc/apache2/sites-available/default (远程链接服务器的办法: ssh 12x.xxx.xxx.xxx) 2. ...

  6. PAT甲题题解-1055. The World's Richest (25)-终于遇见一个排序的不水题

    题目简单,但解题的思路需要转换一下,按常规思路肯定超时,推荐~ 题意:给出n个人的姓名.年龄和拥有的钱,然后进行k次查询,输出年龄在[amin,amx]内的前m个最富有的人的信息.如果财富值相同就就先 ...

  7. wordpress学习五: 通过wordpress_xmlrpc的python包远程操作wordpress

    wordpress提供了丰富的xmlrpc接口api来供我们远程操控wp的内容.伟大的开源社区有人就将这些api做了一下封装,提供了一个功能比较完整的python库,库的使用文档地址http://py ...

  8. linux 常用命令-变量命令

    想要的结果,有时候我们想使用上一句命令的执行结果,当然可以通过鼠标去复制粘贴,但是这样既不库又效率低,所以想能不能通过快捷键获取上一句命令的值执行结果呢,答案是不能,后来想如果能把执行结果存入变量那不 ...

  9. java 多维数据定义

            //一维数组定义与输出class  less02{ public static void main(String[] args)  {  int stu[]=new int[]{1,2 ...

  10. Linux命令(二十四) 磁盘管理命令(二) mkfs,mount

    一.格式化文件系统 mkfs 当完成硬盘分区以后要进行硬盘的格式化,mkfs系列对应的命令用于将硬盘格式化为指定格式的文件系统.mkfs 本身并不执行建立文件系统的工作,而是去调用相关的程序来执行.例 ...