本文将讲述如何在 Django 项目中使用 Q 对象构建复杂的查询条件。 假设有如下的 model:
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
然后我们创建了一些数据:
Question.objects.create(
question_text='what are you doing',
pub_date=datetime.datetime(2015, 11,7)
)
Question.objects.create(
question_text='what is wrong with you',
pub_date=datetime.datetime(2014, 11, 7)
)
Question.objects.create(
question_text='who are you',
pub_date=datetime.datetime(2015, 10, 7)
)
Question.objects.create(
question_text='who am i',
pub_date=datetime.datetime(2014, 10, 7)
)
>>> Question.objects.all()
[<Question: what are you doing>, <Question: what is wrong with you>,
<Question: who are you>, <Question: who am i>]
AND 查询
将多个 Q 对象作为非关键参数或使用 & 联结即可实现 AND 查询:
>>> from django.db.models import Q
# Q(...)
>>> Question.objects.filter(Q(question_text__contains='you'))
[<Question: what are you doing>, <Question: what is wrong with you>, <Question: who are you>]
# Q(...), Q(...)
>>> Question.objects.filter(Q(question_text__contains='you'), Q(question_text__contains='what'))
[<Question: what are you doing>, <Question: what is wrong with you>]
# Q(...) & Q(...)
>>> Question.objects.filter(Q(question_text__contains='you') & Q(question_text__contains='what'))
[<Question: what are you doing>, <Question: what is wrong with you>]
OR 查询
使用 | 联结两个 Q 对象即可实现 OR 查询:
# Q(...) | Q(...)
>>> Question.objects.filter(Q(question_text__contains='you') | Q(question_text__contains='who'))
[<Question: what are you doing>, <Question: what is wrong with you>, <Question: who are you>, <Question: who am i>]
NOT 查询
使用 ~Q(...) 客户实现 NOT 查询:
# ~Q(...)
>>> Question.objects.filter(~Q(question_text__contains='you'))
[<Question: who am i>]
与关键字参数共用
记得要把 Q 对象放前面:
# Q(...), key=value
>>> Question.objects.filter(Q(question_text__contains='you'), question_text__contains='who')
[<Question: who are you>]
OR, AND, NOT 多条件查询
这几个条件可以自由组合使用:
# (A OR B) AND C AND (NOT D)
>>> Question.objects.filter((Q(question_text__contains='you') | Q(question_text__contains='who')) & Q(question_text__contains='what') & ~Q(question_text__contains='are'))
[<Question: what is wrong with you>]
动态构建查询条件
比如你定义了一个包含一些 Q 对象的列表,如何使用这个列表构建 AND 或 OR 查询呢? 可以使用 operator 和 reduce:
>>> lst = [Q(question_text__contains='you'), Q(question_text__contains='who')]
# OR
>>> Question.objects.filter(reduce(operator.or_, lst))
[<Question: what are you doing>, <Question: what is wrong with you>, <Question: who are you>, <Question: who am i>]
# AND
>>> Question.objects.filter(reduce(operator.and_, lst))
[<Question: who are you>]
这个列表也可能是根据用户的输入来构建的,比如简单的搜索功能(搜索一个文章的标题或内容或作者名称包含某个关键字):
q = request.GET.get('q', '').strip()
lst = []
if q:
for key in ['title__contains', 'content__contains',
'author__name__contains']:
q_obj = Q(**{key: q})
lst.append(q_obj)
queryset = Entry.objects.filter(reduce(operator.or_, lst))
参考资料
- Parerga und Paralipomena » Blog Archive » The power of django’s Q objects
- Making queries | Django documentation | Django
- QuerySet API reference | Django documentation | Django
- django/tests.py at master · django/django · GitHub
- 9.9. operator — Standard operators as functions — Python 2.7.10 documentation
- 2. Built-in Functions — Python 2.7.10 documentation
相关推荐
Q对象是Django ORM提供的一种高级查询工具,它可以让你构建复杂的查询表达式,支持AND、OR和NOT操作。例如: 1. AND关系:`Book.objects.filter(id__gt=2, bread__gt=20)` 或者 `Book.objects.filter(Q(bread__gt=...
F表达式可以用来比较模型字段的值,而Q对象则可以构建复杂的查询条件。 6. 使用数据库索引。索引能够显著提高查询速度,特别是对于大数据集而言,建立适当索引是提高查询效率的重要手段。 7. 对于大数据集的查询,...
在处理多条件查询时,通常有两种主要方法:一是使用字典,二是使用`Q`对象。本文主要讨论使用字典的方式。这种方式适合于当查询条件来自用户输入或动态构建的情况。 以下是一个具体的例子,展示了一个视图函数`...
首先,Q()对象主要用于构建复杂的查询条件,它可以组合多个查询条件,形成逻辑上的“与”(AND)或“或”(OR)关系。例如,如果你想查找名字为"cox"或"Tom"的作者,可以使用如下代码: ```python from django.db....
- 使用`Q对象`可以构建复杂的查询条件,例如`Q(age__gt=30) & Q(gender='F')`表示年龄大于30且性别为女的用户。 - `exclude()`也可以接受Q对象,如`exclude(Q(age__lt=18) | Q(is_active=False))`排除未成年或未...
- **数据过滤**:使用Q对象等工具对查询结果进行复杂条件过滤。 - **获取单个对象**:当查询结果可能为空或有多个时,使用get()方法需谨慎处理异常。 - **数据排序**:使用order_by()方法对查询结果进行排序。 - **...
Django的ORM(对象关系映射)是其框架的核心组件之一,它允许开发者使用Python对象来操作数据库,而无需直接编写SQL语句。这极大地提高了开发效率和代码可读性。下面我们将深入探讨Django ORM的源码结构和基本工作...
Python ORM,全称为Object-Relational Mapping,是Python编程中用于数据库操作的一种技术,它将对象模型与关系数据库之间的映射关系,使得开发者可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。...
`Q`对象允许我们构建复杂的逻辑表达式。例如: ```python from django.db.models import Q keywords = ['key1', 'key2'] query_res = model.objects.filter(Q(title__contains=keywords[0]) | Q(title__contains=...
`Q`对象是Django ORM中的一个强大工具,用于构建复杂的查询条件。在Django 3中,`Q`对象的使用更加灵活,可以帮助开发者编写更清晰、更简洁的查询语句。 ### 7. 优化的数据库操作 Django 3 对数据库查询进行了优化...
在Python的Web开发框架Django中,创建数据库模型是构建应用程序的重要步骤。Django提供了ORM(Object-Relational Mapping)机制,使得我们可以用Python类来定义数据库表结构。本篇文章将详细讲解如何在Django中创建第...
此外,本书可能还会讨论一些实际项目,让读者有机会将所学知识付诸实践,如构建简单的Web应用(使用Flask或Django框架)、爬取和分析网页数据(使用BeautifulSoup和requests库)以及自动化任务(使用Python的os和...
开发过程中,Python程序员可以利用各种第三方库,如NumPy和Pandas进行数据分析,Django或Flask构建Web应用,TensorFlow和Keras进行机器学习等。同时,Python社区提供了丰富的教程、文档和工具,如PyPI(Python ...