`

Django: 使用 Q 对象构建复杂的查询语句

阅读更多

      本文将讲述如何在 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))
分享到:
评论

相关推荐

    django 利用Q对象与F对象进行查询的实现

    Q对象是Django ORM提供的一种高级查询工具,它可以让你构建复杂的查询表达式,支持AND、OR和NOT操作。例如: 1. AND关系:`Book.objects.filter(id__gt=2, bread__gt=20)` 或者 `Book.objects.filter(Q(bread__gt=...

    详解Django的model查询操作与查询性能优化

    F表达式可以用来比较模型字段的值,而Q对象则可以构建复杂的查询条件。 6. 使用数据库索引。索引能够显著提高查询速度,特别是对于大数据集而言,建立适当索引是提高查询效率的重要手段。 7. 对于大数据集的查询,...

    解决Django中多条件查询的问题

    在处理多条件查询时,通常有两种主要方法:一是使用字典,二是使用`Q`对象。本文主要讨论使用字典的方式。这种方式适合于当查询条件来自用户输入或动态构建的情况。 以下是一个具体的例子,展示了一个视图函数`...

    Django中Q查询及Q()对象 F查询及F()对象用法

    首先,Q()对象主要用于构建复杂的查询条件,它可以组合多个查询条件,形成逻辑上的“与”(AND)或“或”(OR)关系。例如,如果你想查找名字为"cox"或"Tom"的作者,可以使用如下代码: ```python from django.db....

    Django的ORM常用查询操作总结.rar

    - 使用`Q对象`可以构建复杂的查询条件,例如`Q(age__gt=30) & Q(gender='F')`表示年龄大于30且性别为女的用户。 - `exclude()`也可以接受Q对象,如`exclude(Q(age__lt=18) | Q(is_active=False))`排除未成年或未...

    The Django Book.pdf

    - **数据过滤**:使用Q对象等工具对查询结果进行复杂条件过滤。 - **获取单个对象**:当查询结果可能为空或有多个时,使用get()方法需谨慎处理异常。 - **数据排序**:使用order_by()方法对查询结果进行排序。 - **...

    Django 对象关系映射(ORM)源码详解

    Django的ORM(对象关系映射)是其框架的核心组件之一,它允许开发者使用Python对象来操作数据库,而无需直接编写SQL语句。这极大地提高了开发效率和代码可读性。下面我们将深入探讨Django ORM的源码结构和基本工作...

    Python-从零开始造一个PythonORM

    Python ORM,全称为Object-Relational Mapping,是Python编程中用于数据库操作的一种技术,它将对象模型与关系数据库之间的映射关系,使得开发者可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。...

    django model 条件过滤 queryset.filter(**condtions)用法详解

    `Q`对象允许我们构建复杂的逻辑表达式。例如: ```python from django.db.models import Q keywords = ['key1', 'key2'] query_res = model.objects.filter(Q(title__contains=keywords[0]) | Q(title__contains=...

    Django3

    `Q`对象是Django ORM中的一个强大工具,用于构建复杂的查询条件。在Django 3中,`Q`对象的使用更加灵活,可以帮助开发者编写更清晰、更简洁的查询语句。 ### 7. 优化的数据库操作 Django 3 对数据库查询进行了优化...

    Python学习笔记之Django创建第一个数据库模型的方法

    在Python的Web开发框架Django中,创建数据库模型是构建应用程序的重要步骤。Django提供了ORM(Object-Relational Mapping)机制,使得我们可以用Python类来定义数据库表结构。本篇文章将详细讲解如何在Django中创建第...

    2019新书系列-Introduction to Python Programming

    此外,本书可能还会讨论一些实际项目,让读者有机会将所学知识付诸实践,如构建简单的Web应用(使用Flask或Django框架)、爬取和分析网页数据(使用BeautifulSoup和requests库)以及自动化任务(使用Python的os和...

    Python-3.7.6.rar

    开发过程中,Python程序员可以利用各种第三方库,如NumPy和Pandas进行数据分析,Django或Flask构建Web应用,TensorFlow和Keras进行机器学习等。同时,Python社区提供了丰富的教程、文档和工具,如PyPI(Python ...

Global site tag (gtag.js) - Google Analytics