Advertisement

Django模型条件过滤 querySet.filter(**conditions)用法详解

  • 5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
基于Django框架,`model`类象征着数据表的抽象概念。而`queryset`则代表用于操作这些模型实例集合的数据结构。在Django ORM框架内,该函数$`queryset.filter(**conditions)`$扮演着重要角色,负责从查询集合中提取符合条件的数据。本文旨在详细解析Django ORM中的`filter()`方法及其相关参数设置,帮助开发者优化查询逻辑。`queryset.filter(**conditions)`这一功能用于获取满足给定参数的实例。其中`**conditions`属于一个字典,其键值对对应指定的字段及其过滤条件。例如:```python queryset = model.objects.all() condtions = {date: 2018-05-22} query_res = queryset.filter(**condtions) ```该代码将返回所有日期属性值等于2018-05-22的模型记录实例。 对于字段比较操作,Django提供了丰富的一系列运算符,具体内容如下所示: - 使用`__exact`实现精确匹配功能,具体语法形式为:`field__exact: value` - 通过`__iexact`可实现不区分大小写的精确匹配效果,其表达方式为:`field__iexact: value` - 实现字段包含关系判断的运算符是`__contains`,这与SQL中的`LIKE %value%`功能一致,具体写法如下:$field__contains: value$ - 通过不区分大小写的逻辑实现包含性匹配的运算符是`__icontains`,其表达方式为:$field__icontains: value$ - 实现字段大于值比较的运算符是`__gt`,具体的使用方法为:$field__gt: value$ - 类似地,用于实现字段大于等于操作的运算符是`__gte`,其写法如下:$field__gte: value$ - 通过运算符`__lt`可以进行字段小于值比较操作,具体形式为:$field__lt: value$ - 对应的不大于操作可以通过不区分大小写的运算符`__lte`来实现,其表达方式是:$field__lte: value$ - 实现字段属于特定范围判断的运算符是`__in`,具体的使用方法为:$field__in: [value1, value2, ...]$ - 以某个字符串开头匹配的条件可以用运算符`__startswith`来表示,具体写法如下:$field__startswith: value$ - 不区分大小写的前缀匹配操作可以通过运算符`__istartswith`实现,其表达方式为:$field__istartswith: value$ - 以某个字符串结尾匹配的条件可以用运算符`__endswith`来表示,具体形式如下:$field__endswith: value$ - 对应的不区分大小写的后缀匹配操作可以通过运算符`__iendswith`实现,其写法为:$field__iendswith: value$ - 实现字段在指定范围内的查找条件可以使用运算符`__range`,具体的语法形式是:$field__range: (start, end)$ - 用于筛选日期字段的年份、月份和日期的运算符分别是`__year`, `__month`, 和`__day` - 最后,判断字段值是否为`NULL`的条件可以通过运算符`__isnull`来实现。若其返回结果为$True$,则表示该字段的实际值为空;反之,则表明实际值不为空。 多种不同的条件可以通过合理搭配进行组合使用。如下面列举的实例中所示。```python condtions = {date__lt: 2018-05-22, status: 未支付, name__exact: yangxia} query_res = queryset.filter(**condtions) ```该查询将返回所有在earlier于2018年5月22日之前、状态为未支付并且name与yangxia完全一致的记录。`queryset.exclude(**conditions)`反向于`filter()`,其作用在于过滤掉满足特定条件的数据项。通过删除查询集合中的重复数据项,可以使用`querySet.distinct()`方法来实现去重功能。当在实际应用场景中需求涉及多于一个关键词时,通过`Q`对象来进行复合查询是可行的。`Q`对象则赋予我们建立复杂而精确的逻辑表达式的权利或能力。比如:```python from django.db.models import Q keywords = [key1, key2] query_res = model.objects.filter(Q(title__contains=keywords[0]) | Q(title__contains=keywords[1])) ```该函数会返回满足以下条件的所有记录:标题中包含`key1`或`key2`。此外,在`Django`框架的高级数据操作中,可以通过连续调用`queryset.filter()`和`queryset.exclude()`的方法,构建出更为复杂的数据查询逻辑。比如:在实际应用中,我们可以利用这些方法来实现动态且复杂的查询需求。```python q1 = model.objects.filter(headline__startswith=What) q2 = q1.filter(pub_date__gte=datetime.date.today()) q3 = q2.exclude(body_text__icontains=food) ```该系统将包含题库中的标题均采用以“`What`”开头的形式,并且包括发布日期早于或等于今天的记录,同时排除了所有涉及与“food”相关的内容。Django的`queryset.filter()`方法采用了便捷的方式进行数据库查询操作,并支持多样化的条件过滤与逻辑组合功能。该库通过这些特点帮助开发者轻松应对复杂的数据库查询需求。此外,结合与Django内置`Q`对象和链式调用方式,能够灵活构造适用于不同复杂场景的数据库查询语句。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • SQL中ON与WHERE的区别
    优质
    本文详细解析了在SQL查询语句中使用ON和WHERE来设置过滤条件的不同之处,帮助读者理解何时以及如何正确运用这两个关键字。 在SQL查询中,`ON` 和 `WHERE` 都用于设置过滤条件,但它们在不同类型的查询中扮演的角色和产生的效果是有区别的。本篇文章将深入探讨`ON`和`WHERE`在`JOIN`操作中的具体差异,并通过实例来帮助理解。 `JOIN`操作是SQL中用于合并两个或更多表的数据的关键部分。主要有四种类型的`JOIN`: `INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN` 和 `FULL OUTER JOIN`. 我们首先关注 `INNER JOIN`, 因为它是使用`ON`和`WHERE`最相似的情况。 1. **INNER JOIN**: - 在`INNER JOIN`中,可以同时用到`ON`和`WHERE`来设置过滤条件。但是它们的应用顺序不同。 - 使用 `ON` 设置的条件会在两个表进行笛卡尔积运算之后对结果进行初步筛选,也就是说,在连接操作发生后应用这些条件。 - 如果在执行 `INNER JOIN` 的时候既使用了 `ON`, 也用了 `WHERE`, 那么 `WHERE` 条件会进一步过滤由 `ON` 过滤后的数据集。 - 示例: ```sql SELECT * FROM person p INNER JOIN account a ON p.id = a.id AND p.id != 4 AND a.id != 4; SELECT * FROM person p INNER JOIN account a ON p.id = a.id WHERE p.id != 4 AND a.id != 4; ``` 这两个查询的结果是相同的,因为在 `INNER JOIN` 中, `ON` 和 `WHERE` 的过滤条件都只对最终的匹配结果生效。 2. **LEFT JOIN**(或`RIGHT JOIN`): - `LEFT JOIN`(或`RIGHT JOIN`)保留左表(或右表)的所有记录,即使在右表(或左表)中没有匹配的记录。 - 使用 `ON` 设置条件仅对非主侧有效, 而 `WHERE` 则作用于整个结果集。 - 当使用 `LEFT JOIN` 时,如果通过 `ON` 条件未能找到对应的行,则该行在连接的另一端为NULL。 - 示例: ```sql SELECT * FROM person p LEFT JOIN account a ON p.id = a.id AND p.id != 4 AND a.id != 4; ``` 在这个例子中, 即使有 `p.id != 4` 的条件,`LEFT JOIN` 还是会保留所有来自 `person` 表的记录,只是在没有匹配到对应行的情况下,其对应的字段值为NULL。 如果添加了 `WHERE` 条件: ```sql SELECT * FROM person p LEFT JOIN account a ON p.id = a.id WHERE p.id != 4 AND a.id != 4; ``` 这时, `WHERE` 条件会过滤掉在 `person` 表中ID为4的记录,即使在执行了 `LEFT JOIN` 的情况下使用了 `ON`, 因为 `WHERE` 是在整个结果集上进行操作。 总结来说,`ON` 主要用于定义两个表之间的关联条件, 而 `WHERE` 则对整个查询的结果进行过滤。在 `INNER JOIN` 中两者的作用基本相同,在执行 `LEFT JOIN` 和 `RIGHT JOIN` 时,它们的效果会有所不同:使用 `ON`, 过滤仅限于非主侧的记录;而通过 `WHERE`, 可以在整个结果集中应用条件。 理解这些区别对于编写更高效、准确的SQL查询至关重要。希望这篇文章的内容能帮助你理解和运用`ON`和`WHERE`的区别,如有任何疑问欢迎进一步交流讨论。
  • Expected Conditions汇总及代码
    优质
    本文章全面总结了Expected Conditions模块在自动化测试中的使用方法,并详细解析相关代码,帮助读者深入理解其功能和应用场景。 Expected Conditions模块是Selenium WebDriver中的一个关键组成部分,它提供了一系列的条件判断函数用于在自动化测试脚本中等待特定的Web页面状态或元素行为。这些条件有助于编写更健壮且可靠的测试,并确保执行下一步操作前网页或元素已经准备就绪。 一、Expected Conditions模块详解 1. 模块定义:Expected Conditions模块(`selenium.webdriver.support.expected_conditions`)是Selenium WebDriver支持的一个子模块,用于判断网页元素的状态,如是否存在、是否可见、是否可点击等。通常与WebDriverWait配合使用实现智能等待,在达到预设的等待时间之前不断检查期望条件是否满足,并在满足后继续执行后续代码或持续等待。 2. 常见Expected Conditions: - `title_is(title)`:等待直到网页标题完全匹配给定字符串。 - `title_contains(text)`:等待直到网页标题包含特定文本。 - `presence_of_element_located(locator)`:等待直到使用指定定位器找到至少一个元素。 - `visibility_of_element_located(locator)`:等待直到定位到的元素可见。 - `element_to_be_clickable(locator)`:等待直到元素既可见又可点击。 - `frame_to_be_available_and_switch_to_it(frameLocator)`:等待直到特定框架可用并切换至该框架。 - `invisibility_of_element_located(locator)`:等待指定元素不可见。 二、Expected Conditions模块应用示例 2.1 使用`WebDriverWait`和`expected_conditions`配合实例: 脚本使用`WebDriverWait(driver, 10).until(EC.title_is(百度一下,你就知道))`等待最多10秒直到网页标题变为“百度一下,你就知道”,然后继续执行。如果在规定时间内未满足条件,则抛出TimeoutException异常。 2.2 使用`element_to_be_clickable`等待元素可点击状态实例: ```python element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, kw))) element.send_keys(新梦想软件测试) ``` 脚本在此处等待ID为“kw”的元素变为可见且可点击,并输入文本。 2.3 `unittest`框架与`expected_conditions`结合: 在单元测试案例中,使用`test_searchinputbox_is_visibility`方法首先调用`visibility_of()`检查搜索框(ID为kw)是否可见。代码段如下所示: ```python self.assertTrue(EC.visibility_of(self.driver.find_element(By.ID, kw))) ``` 该断言会通过如果元素可见。 三、使用注意事项 - `EC.visibility_of()`方法返回的是评估对象而不是实际的元素,因此不能直接用于操作如发送键值。需要将其转换为真实元素后才能执行。 - 根据实际情况选择合适的预期条件以避免不必要的等待:仅需存在则用`presence_of_element_located()`, 需要可点击则使用`element_to_be_clickable()`。 - 使用合理超时时间设置,以防因网络延迟等因素导致测试失败。 - `expected_conditions`模块提供的函数可以组合以实现更复杂的等待逻辑。 Expected Conditions模块是Selenium WebDriver中的重要工具,它使我们能够构建出更加精确和稳定的Web自动化测试脚本,并提高了测试的可靠性和效率。通过合理利用这些条件,我们可以确保在执行自动化测试时网页和元素的状态符合预期。
  • 协同
    优质
    本篇文章深入浅出地讲解了协同过滤算法的工作原理、分类及其应用。适合初学者入门及开发者进阶参考。 多伦多大学的一篇硕士论文详细介绍了协同过滤算法,并且比一些综述文章更容易理解。 在阅读这篇论文之前,我对基于模型的协同过滤算法的理解比较模糊,但读完之后有了清晰的认识,非常推荐大家去阅读这篇文章,值得一读。 ### 协同过滤算法详解 #### 一、引言与背景 作为推荐系统领域的重要技术之一,协同过滤(Collaborative Filtering, CF)的核心思想是利用用户或物品之间的相似性来预测用户对未接触过物品的兴趣度。Benjamin Marlin撰写的论文《协同过滤:一种机器学习视角》提供了对协同过滤算法的全面深入分析,特别是基于模型的方法进行了详细介绍。 #### 二、协同过滤概述 协同过滤主要分为两大类:基于用户的协同过滤(User-Based Collaborative Filtering, UBCF)和基于物品的协同过滤(Item-Based Collaborative Filtering, IBCF),它们的核心区别在于计算相似性的对象不同。 - **UBCF** 寻找与目标用户兴趣相似的其他用户,然后推荐这些相似用户喜欢但目标用户尚未接触过的物品。 - **IBCF** 计算物品之间的相似度,并向用户推荐与其过去喜欢的物品相似的新物品。 此外还有基于模型的方法,这类方法通常通过构建统计模型来捕获潜在关系以提高预测准确性。 #### 三、基于模型的协同过滤详解 该类方法试图建立用户和物品之间隐含关系的数学模式。 ##### 3.1 模型建立 - **矩阵分解**:最常见的技术之一,它将评分矩阵分解为两个低秩矩阵(代表用户的偏好特征与项目的属性)并估计未知分数。这有助于处理稀疏数据问题,并揭示隐藏结构。 - **概率图模型**:利用贝叶斯网络等工具表示用户和物品之间的复杂关系,能够更好地处理不确定性和非线性关联。 - **深度学习方法**:随着人工智能技术的进步,研究者开始使用神经网络来捕捉深层特征。例如自动编码器(Autoencoder)、卷积神经网络(Convolutional Neural Network, CNN)。 ##### 3.2 评价指标与实验设计 评估推荐系统性能时常用的度量包括准确率(Precision)、召回率(Recall)等;同时,论文中提出了一种新的测试流程来验证不同算法的泛化能力,并通过对比分析提供了关于各种方法相对表现的重要见解。 #### 四、论文贡献 - **新预测技术**:除了对现有评级预测法进行梳理外,还提出了多种改进方案。 - **大规模实验结果**:展示了九种预测模型在实际应用中的性能差异,为后续研究提供参考价值。 - **理论分析**:从机器学习视角出发深入解析了协同过滤任务,并揭示了许多方法实际上是标准技术的应用或变体。 #### 五、总结与展望 《协同过滤:一种机器学习视角》全面探讨了各种协同过滤算法和技术。这篇论文不仅梳理和归纳现有方法,还提出新的改进方案。对于希望深入了解该领域的读者来说是一份极好的参考资料。随着大数据及AI的发展,未来协同过滤技术将继续进步并为用户提供更个性化精准的服务。
  • V在软开发程中的
    优质
    本文详细介绍了V模型在软件开发过程中的应用与实践,解释了其特点、优势及局限性,并提供了具体案例以帮助读者更好地理解和运用这一模型。 这系列视频来源于一个免费资源网站。在此我非常感谢主讲贺炘老师以及所有分享这些视频的人。作为一名软件测试人员,本着资源共享、共同进步的原则,我想与大家分享我自己收藏的资料。希望大家会喜欢这些内容。
  • Django 3.0 使
    优质
    《Django 3.0 使用详解》是一本深入介绍Python web框架Django 3.0版本特性和应用开发技巧的专业书籍,适合Web开发者阅读。 本段落将详细介绍Django的概念及其作用,并通过实例讲解Django中的路径设置(urls)、视图方法、通用视图的应用、模型的运用以及模板的使用情况。此外,还将介绍如何以IIS方式部署Django工程。 首先,我们将从概念入手,解释什么是Django及它在Web开发中所扮演的角色。接着,在实例部分将详细展示路径设置中的各项用法,并通过具体代码示例来帮助理解视图方法和通用视图的应用场景、模型的创建与运用以及模板文件的设计思路。最后一步是关于如何利用IIS服务器部署一个完整的Django项目,为用户提供详细的步骤指导。 通过对这些核心概念和技术细节的深入探讨,读者将能够更好地掌握使用Django进行高效Web应用开发的方法,并具备独立完成从开发到发布的全流程能力。
  • Django类Meta
    优质
    本文将深入探讨Django框架中的模型类Meta选项,介绍其常用属性和用法,并通过示例代码帮助读者理解如何自定义模型的元数据。 在Django框架中,Model定义了数据模型的结构,并描述数据库中的表结构。`class Meta`是一个内嵌类,用于定义与字段无关的重要配置选项(元数据),例如排序选项、Admin界面设置等。 以下是可能使用的Meta选项: 1. **app_label**: 当你的模型不在默认的应用程序包中时(即不是位于标准的models.py文件下),你需要通过指定`app_label=my_app_name`来告诉Django该模型属于哪个应用。这确保了框架能够正确识别和处理这个模型。 2. **db_table**: Django会根据应用程序名和模型名自动生成数据库表的名字,但你可以使用`db_table=your_custom_table`来自定义表的名称。 3. **db_tablespace**: 对于支持表空间(如Oracle)的数据库系统,可以利用`db_tablespace=tablespace_name`来指定特定的存储位置或性能优化策略。 4. **get_latest_by**: 如果模型包含日期时间字段(例如创建时间和更新时间),你可以通过设置`get_latest_by=created_at`让Django使用该字段作为获取最新记录的标准,默认情况下是按照创建时间排序,但可以自定义为任何相关的日期或时间字段。 5. **managed**: 默认情况下,Django会自动管理与模型关联的数据库表。然而,在某些场景下(比如需要直接操作已存在的数据表),你可以通过设置`managed=False`来禁止这种行为,从而让系统不再处理迁移等任务。 6. **order_with_respect_to**: 当存在多对多关系时,例如一个Topping可以属于多个Pizza,并且希望根据某个字段的顺序显示这些关联(比如添加到披萨上的先后),可以通过设置如`order_with_respect_to=pizza`来实现。这将提供额外的方法用于获取和修改这个排序。 7. **ordering**: `ordering=[-created_at]`定义了默认查询结果中的记录排列方式,支持指定多个字段进行复合排序(例如按日期降序然后按照作者升序)。 8. **permissions**: 在Django的Admin界面中,通过设置额外权限如`permissions=[(can_deliver_pizzas, Can deliver pizzas)]`可以增加自定义访问控制功能。这使得管理用户和角色时更加灵活方便,并能更精确地限制不同用户的操作范围。 这些元数据选项极大地增强了Model的功能性和灵活性,在构建高效、易于维护的数据库模型方面发挥着关键作用。
  • 使PyCharm通Django连接MySQL数据库
    优质
    本教程详细讲解了如何在PyCharm开发环境中配置和使用Django框架连接MySQL数据库,适合Python Web开发入门者学习。 本段落主要介绍了如何使用PyCharm连接MySQL数据库在Django项目中的实现,并通过示例代码进行了详细的讲解,对学习或工作中遇到的相关问题具有参考价值。需要相关指导的读者可以参考此文。
  • GMM
    优质
    本文详细解析了GMM(高斯混合模型)算法的工作原理、应用场景及实现步骤,帮助读者深入理解并灵活运用该技术。 详细介绍了GMM模型训练的EM算法,这对理解说话人识别中的模型建立过程有一定的帮助。