Django笔记——操作数据库(ORM)第四节

Django学习之操作数据库

操作数据库——ORM模型中的基本查询操作

一、查询方法

查询一般是使用 filterexclude、以及get 三个方法来实现,我们可以在调用这些方法的时候传递不同的参数来实现查询需求。在 ORM 层面,这些查询条件都是使用 field + __ + condition 的方式来使用的。

注:__是两个下划线

方法 描述 示例
filter(*args, **kwargs) 返回与查询条件匹配的对象集合。 Article.objects.filter(title__icontains='hello')
exclude(*args, **kwargs) 返回与查询条件不匹配的对象集合。 Article.objects.exclude(title__icontains='hello')
get(*args, **kwargs) 返回与查询条件精确匹配的一个对象。如果超过一个或没有结果,则抛出异常。 Article.objects.get(id=1)
  • filter(): 用于筛选符合特定条件的对象集合。
  • exclude(): 类似于filter(),但返回的是不符合条件的对象集合。
  • get(): 用于获取单个特定对象。当查询可能返回多个对象或没有对象时,应谨慎使用,因为它会抛出异常。

二、查询条件

条件 描述 示例
exact 精确匹配。 Article.objects.filter(id__exact=1)
iexact 忽略大小写的精确匹配。 Article.objects.filter(title__iexact='dou5战队加油!')
contains 包含指定字符串,区分大小写。 Article.objects.filter(title__contains='Dou5')
icontains 包含指定字符串,不区分大小写。 Article.objects.filter(title__icontains='dou5')
in 字段值是否在给定列表中。 Article.objects.filter(id__in=[1, 2, 3])
gt 大于。 Article.objects.filter(id__gt=4)
gte 大于等于。 Article.objects.filter(id__gte=4)
lt 小于。 Article.objects.filter(id__lt=4)
lte 小于等于。 Article.objects.filter(id__lte=4)
startswith 以特定字符串开始,区分大小写。 Article.objects.filter(title__startswith='Hello')
istartswith 以特定字符串开始,不区分大小写。 Article.objects.filter(title__istartswith='hello')
endswith 以特定字符串结束,区分大小写。 Article.objects.filter(title__endswith='World')
iendswith 以特定字符串结束,不区分大小写。 Article.objects.filter(title__iendswith='world')
range 值在某个范围内。 Article.objects.filter(pub_time__range=(start_date, end_date))
isnull 根据值是否为NULL过滤。 Article.objects.filter(pub_time__isnull=True)
regex / iregex 使用正则表达式进行匹配,区分或不区分大小写。 Article.objects.filter(title__iregex=r'^[Hh]ello')

三、综合示例

已知有一个文章(Article)的模型结构,需要执行一系列查询操作:

from django.http import HttpResponse
from .models import Article
from datetime import datetime

def complex_query_example(request):
    # 获取所有标题包含"dou5"的文章(忽略大小写)
    articles_icontains = Article.objects.filter(title__icontains='dou5')
    
    # 获取ID大于3的所有文章
    articles_gt = Article.objects.filter(id__gt=3)
    
    # 查找所有标题以"Hello"开头的文章(忽略大小写)
    articles_istartswith = Article.objects.filter(title__istartswith='hello')
    
    # 查找发布日期在2025年4月5日至2025年4月9日之间的文章
    start_date = datetime(2025, 4, 5)
    end_date = datetime(2025, 4, 9)
    articles_range = Article.objects.filter(pub_time__range=(start_date, end_date))
    
    # 查找所有未设置发布时间的文章
    articles_isnull = Article.objects.filter(pub_time__isnull=True)
    
    # 输出查询结果信息
    print(f"Found {articles_icontains.count()} articles containing 'dou5'.")
    print(f"Found {articles_gt.count()} articles with ID greater than 3.")
    print(f"Found {articles_istartswith.count()} articles starting with 'Hello'.")
    print(f"Found {articles_range.count()} articles published between April 5 and April 9, 2025.")
    print(f"Found {articles_isnull.count()} articles without a publication time.")
    
    return HttpResponse('查询操作完成!')

你可能感兴趣的:(Django,数据库,django,笔记)