在 Django 开发中,ORM(Object Relational Mapping)模型的查询操作是非常重要的一部分。它提供了一种方便、高效的方式来与数据库进行交互,让开发者能够更加专注于业务逻辑的实现。本文将详细介绍 Django-ORM 模型的查询操作,包括基础方法、查询条件、特殊方法以及一些实用的技巧和示例代码。
查询一般使用filter、exclude以及get三个方法来实现,可以调用不同的方法时传入不同的参数来实现查询需求。
ORM模型-查询操作:
-
filter:filter方法主要用于根据指定的条件筛选查询结果。它可以接受各种条件表达式,例如比较运算符(==、>、<等)、逻辑运算符(and_、or_)组合的表达式以及模糊查询(like)等条件,以返回符合要求的对象集合。 -
exclude:在 Django ORM 中,exclude方法用于排除满足指定条件的对象,返回不符合这些条件的对象集合。这是一种方便的反向筛选方式。代码示例:# 排除特定作者的书籍: books_exclude_author = Book.objects.exclude(author='J.K. Rowling') -
get:get方法用于获取满足特定条件的单个对象。它与filter方法的区别在于,filter通常返回一个对象集合(可能是一个包含多个对象的列表),而get方法期望只返回一个符合条件的对象。如果没有找到符合条件的对象或者找到多个对象,会抛出异常。# 查询id为1的书籍: try: book = Book.objects.get(id=1) print(book.title, book.author, book.price) except Book.DoesNotExist: print("Book with id 1 does not exist") except Book.MultipleObjectsReturned: print("Multiple books with id 1 found")
查询条件:使用模板: 字段名__exact=条件 ,__是 Django 查询表达式中的一种语法
-
exact:exact用于进行精确匹配查询。它主要用于确保查询条件与数据库中的字段值完全匹配(包括大小写),没有任何模糊或近似的比较。这在处理字符串、数字等各种数据类型时非常有用,可以避免因为默认的查询行为可能导致的意外匹配。 使用模板:字段名__exact=条件#要精确查询名字为`J.K. Rowling`的作者,可以这样使用`exact` author = Author.objects.filter(name__exact='J.K. Rowling').first() -
iexact:iexact是一种用于字符串字段的不区分大小写的精确匹配查询方式。它主要用于在进行字符串比较时,忽略字符的大小写,只要字符内容相同就认为是匹配的。这在处理用户输入或者数据来源可能存在大小写不一致的情况时非常有用。#当我们想要查找名称为`apple`的产品,但不区分大小写时,可以使用`iexact` products = Product.objects.filter(name__iexact='apple') -
contains:contains是一种用于字符串字段的模糊查询方法。它用于查找那些指定字符串字段中包含给定子字符串的记录。这使得在处理文本数据时,可以方便地搜索包含特定关键词或短语的记录。#例如:要查询标题中包含 “Python” 的博客文章 python_posts_title = BlogPost.objects.filter(title__contains='Python') -
icontains:类似contains;区别大小写不敏感 -
in:in查询用于检查字段值是否在一个给定的离散值集合中# 例如,查询价格为 10.00、15.00 或 20.00 的产品: prices_list = [10.00, 15.00, 20.00] products_in_price_list = Product.objects.filter(price__in=prices_list) -
gt:gt对数据进行 “大于” 条件的筛选# 如果你想查询价格大于 10 的书籍: books = Book.objects.filter(price__gt = 10) -
gte:gte用于在查询数据库时筛选出满足"大于等于"某个特定值的记录# 如果你想查询价格大于等于 10 的书籍: books = Book.objects.filter(price__gt = 10) -
lt:lt筛选出模型中某个字段的值小于指定值的记录# 例如,假设有一个名为 “Employee” 的模型,其中包含一个 “age” 字段。如果要查询年龄小于 30 岁的员工 employees = Employee.objects.filter(age__lt = 30) -
lte:lte筛选出模型中某个字段的值小于等于指定值的记录#例如,假设有一个 “Student” 模型,其中包含一个 “grade” 字段,表示学生的成绩。如果想查询成绩小于等于 80 分的学生: students = Student.objects.filter(grade__lte = 80) -
startswith:startswith用于查找以指定字符串开头的记录。#例如,查找标题以 “Python” 开头的博客文章。 BlogPost.objects.filter(title__startswith='Python') -
istarwith:类似startswith;区别大小写不敏感 -
endswith:endswith用于查找以指定字符串结尾的记录#例如,查找标题以 “Python” 结尾的博客文章。 BlogPost.objects.filter(title__endswith='Python') -
iendswith:类似endswith;区别大小写不敏感 -
range:range是一种用于查询数值或日期范围的工具。它允许你指定一个下限和上限,然后查询在这个范围内的记录。这对于处理时间序列数据、数值区间等场景非常有用,比如查询某一时间段内的订单记录或者某一价格区间内的产品。数值范围查询示例
# 要查询价格在 10.00 到 20.00 之间(包括 10.00 和 20.00)的产品: products_in_price_range = Product.objects.filter(price__range=(10.00, 20.00))日期范围查询示例
#要查询在 2024 年 1 月 1 日到 2024 年 12 月 31 日之间开始的事件: from datetime import date start_date = date(2024, 1, 1) end_date = date(2024, 12, 31) events_in_date_range = Event.objects.filter(start_date__range=(start_date, end_date))
以上就是我在学习关于 Django-ORM 模型查询操作的笔记分享,希望对大家有所帮助。在实际开发中,根据具体的需求灵活运用这些查询方法,可以大大提高开发效率。