Q表达式可以包裹查询条件,可以在多个条件之间进行操作:与或非等。Q表达式一般会放在filter()中进行使用,F表达式一般是放在update()中进行使用。

定义模型的models.py文件中,示例代码如下:
from django.db import models

# 定义作者模型
class Author(models.Model):
name = models.CharField(max_length=100, unique=True)
age = models.IntegerField()
email = models.EmailField() class Meta:
db_table = 'author' def __str__(self):
return "%s,%s,%s" % (self.name,self.age, self.email) # 定义出版社模型
class Publisher(models.Model):
name = models.CharField(max_length=100,unique=True) class Meta:
db_table = 'publisher' def __str__(self):
return " ->:%s" % self.name # 定义图书模型
class Book(models.Model):
name = models.CharField(max_length=100, unique=True)
pages = models.IntegerField()
price = models.FloatField()
rating = models.FloatField()
author = models.ForeignKey('Author', on_delete=models.CASCADE)
publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)
score = models.FloatField(null=True) class Meta:
db_table = 'book' def __str__(self):
return "(书名:%s,页数:%s,价格:%s,打折:%s,作者:%s,出版社:%s)" % (self.name, self.pages, self.price, self.rating, self.author, self.publisher) # 定义预定图书的模型
class BookOrder(models.Model):
book = models.ForeignKey('Book', on_delete=models.CASCADE)
price = models.FloatField()
time = models.DateTimeField(auto_now_add=True, null=True) class Meta:
db_table = 'book_order'
mysql数据库中book表中数据如下:

views.py文件中示例代码如下:
from .models import Book
from djang.db import connection
from django.http import HttpResponse
from django.db.models import Q # Q表达式的详解
def index3(request):
# 1. 首先先数据库中添加几条评分的数据
# book = Book.objects.get(pk=1)
# book.score = 4.48
# book.save() # 2. 查找book表中价格大于150,评分score大于4.50并且折扣rating大于0.8的图书信息
# 不使用Q表达式
books = Book.objects.filter(price__gte=150, score__gte=4.50, rating__gte=0.8)
for book in books:
print("%s, %s, %s, %s"%(book.name, book.price, book.score, book.rating))
# 注意:如果前面的%s的个数和后面的参数的个数不相对应的话,
# 就会出现:not all arguments converted during string formatting,不是所有的参数在字符串格式化期间都进行了转化
# 打印出结果:
# 红楼梦, 199.0, 4.95, 0.85 print(connection.queries)
# [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
# {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {
# 'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` WHERE (`book`.`price` >= 150.0e0 AND `book`.`rating` >= 0.8e0 AND `book`.`score` >= 4.5e0)',
# 'time': '0.000'}] # 3. 查找book表中折扣小于0.8,或者是评分小于4.5的图书信息,其中在使用&,|时,两边一定是Q()表达式的值
# 使用Q表达式,多个条件之间进行:或操作
books = Book.objects.filter(Q(rating__lt=0.8)|Q(score__lt=4.5))
for book in books:
print("%s,评分:%s,折扣: %s"%(book.name, book.score, book.rating))
# 打印出结果:
# 三国演义,评分:4.48,折扣: 0.8
# 水浒传,评分:4.83,折扣: 0.75
# 西游记,评分:4.56,折扣: 0.75 print(connection.queries[-1])
#{'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` WHERE (`book`.`rating` < 0.8e0 OR `book`.`score` < 4.5e0)', 'time': '0.000'} # 4.获取价格大于150,并且名字中不包含“记”的图书信息
# 使用Q表达式,多个条件之间进行与非操作
books = Book.objects.filter(Q(price__gte=150) & ~Q(name__icontains="记"))
for book in books:
print("%s, %s"%(book.name, book.price))
# 水浒传, 159.0
# 红楼梦, 199.0 print(connection.queries[-1])
# {'sql': "SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, `book`.`score` FROM `book` WHERE (`book`.`price` >= 150.0e0 AND NOT (`book`.`name` LIKE '%记%'))", 'time': '0.000'}
return HttpResponse("success !")
补充:django ORM中大小比较的符号怎么表示:
  1. __gt: 表示大于
  2. __gte: 表示大于等于
  3. __lt: 表示小于
  4. __lte: 表示小于等于
  5. exclude:表示不等于

77.Q表达式详解的更多相关文章

  1. cron表达式详解

    @Scheduled(cron = "* * * * * *") cron表达式详解 1.cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份( ...

  2. Lambda表达式详解(例子详解)(转自:http://blog.csdn.net/damon316/article/details/51734661)

    Lambda表达式详解(例子详解)     lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 ...

  3. zabbix3.4.7触发器表达式详解

    zabbix触发器表达式详解 概述:触发器中的表达式使用很灵活,我们可以创建一个复杂的逻辑测试监控,触发器表达式形式如下: {<server>:<key>.<functi ...

  4. Spring定时器corn表达式详解

    1.结构 Spring定时器corn表达式详解 2.各字段的含义 字段 允许值 允许的特殊字符 秒 0~59 - * / 分 0~59 - * / 小时 0~23 - * / 日期 1~31 - * ...

  5. angular $q promise详解

    前言 通过本文,你大概能清楚angular promise是个啥,$q又是个啥,以及怎么用它.这里咱们先灌输下promise的思想. 下面写的全是废话,一些看着高逼格其实没什么大作用的概念,想知道$q ...

  6. Cron表达式详解和表达式的验证

    本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...

  7. Java 8 Lambda 表达式详解

    一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...

  8. spring定时任务(@Scheduled注解)cron表达式详解

    cron表达式详解: 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(~) 分钟(~) 小时(~) 天(~) 月(~) 星期(~ =SUN 或 SUN,MON,TU ...

  9. 类型:.net;问题:C#lambda表达式;结果:Lambda表达式详解

    Lambda表达式详解   前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1 ...

随机推荐

  1. Core data 如何查看ObjectId

    ObjectId是Core Data 为每一个数据对象提供的唯一ID标识,获取ObjectID.并打印的方法如下: 步骤: 1. 获取ManagedObject 2. ManagedObject -& ...

  2. 清除DNS解析缓存

    接下来在弹出的命令提示符窗口中输入“ipconfig /displaydns”,我们会看到系统中有多条我们之前使用过的DNS地址,如下图所示 5 然后,我们接着输入命令“ipconfig /flush ...

  3. SSH框架搭建 笔记 (含spring注解驱动)

    分类: web 开发2014-04-27 12:33 354人阅读 评论(0) 收藏 举报 框架springinterface注解 好久没有搭建框架了,今天整理下以前的知识,整合下SSH,没想到手生了 ...

  4. 创建Git本地仓库

    一.获取Git仓库 安装好Git后即可创建Git本地仓库,开始项目的版本管理.有两种方法取得Git项目仓库:1.在现有项目或目录下导入所有文件到Git中:2.从一个服务器克隆一个现有的Git仓库. 1 ...

  5. Ubuntu下使用mail命令发送邮件

    Ubuntu下使用mail命令发送邮件 mail命令在Ubuntu下是需要安装的,使用下条命令进行安装: sudo apt-get install heirloom-mailx 接下来输入用户密码,等 ...

  6. 2.12 学习总结 之 表单校验插件validate

    一.说在前面 昨天 学习了ajax的相关知识 今天 学习表单校验插件validate, 并使用ajax 自定义校验规则 二.validate 插件 1.网络上有许多成熟的插件共使用者参考,插件就是将j ...

  7. HihoCoder第四周:Trie图

    第四周的题目是前两周的综合,综合在一个是KMP算法的思想,一个是树的这么一个数据结构. 题目 : Trie图 输入 每个输入文件有且仅有一组测试数据. 每个测试数据的第一行为一个整数N,表示河蟹词典的 ...

  8. GNS3 模拟DHCP之地址请求

    R1: conf t int f0/0 no shutdown ip address dhcp end R2: conf t int f0/0 no shutdown ip add 12.1.1.2 ...

  9. SpringBoot---条件(th:if)

    Thymeleaf 的条件判断是 通过 th:if 来做的,只有为真的时候,才会显示当前元素 <p th:if="${testBoolean}" >如果testBool ...

  10. 我用Python帮朋友做了张猪肉数据分析图,结果。。。

    却发现他是这么拿我当兄弟的 事情的经过是这样的: 我开开心心的去一家烧饼店吃饭 .   ​ 抬头一看,二师兄又涨价了 叹了口气,再这么下去真的要吃不起夹肉的烧饼了 点了两个烧饼一碗馄饨 快吃完的时候, ...