【Django】执行查询—检索对象

检索对象

以下述模型为基础,讨论检索对象的方式方法:

python 复制代码
from datetime import date

from django.db import models


class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name


class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return self.name


class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField(default=date.today)
    authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField(default=0)
    number_of_pingbacks = models.IntegerField(default=0)
    rating = models.IntegerField(default=5)

    def __str__(self):
        return self.headline

检索全部对象

python 复制代码
>>> all_entries = Entry.objects.all()

通过过滤器检索指定对象

通过添加过滤条件精炼原始 QuerySet。两种最常见的精炼 QuerySet 的方式是:
filter(**kwargs)

返回一个新的 QuerySet,包含的对象满足给定查询参数。
exclude(**kwargs)

返回一个新的 QuerySet,包含的对象 不 满足给定查询参数。

由此可见,对 QuerySet 进行细化的结果本身也是一个 QuerySet,因此可以将细化操作链接在一起。

QuerySets 是惰性的 ------ 创建 QuerySet 的过程不涉及任何数据库活动。你可以一直堆叠过滤条件,但 Django 实际上不会运行查询,直到 QuerySet 被评估

检索单个对象

python 复制代码
>>> one_entry = Entry.objects.get(pk=1)

QuerySet条目数限制

QuerySet是一个对象列表,因此类似python数组切片,可以对条目数进行限制,但是也有区别,不支持负索引。

通常对 QuerySet 进行切片会返回一个新的 QuerySet,它不会评估查询。但是如果使用了 Python 切片语法的 "step" 参数,会实际执行查询。

例子:

python 复制代码
# 返回前5个对象(对应SQL:LIMIT 5)
>>> Entry.objects.all()[:5]
# 返回第六到第十个对象(对应SQL:OFFSET 5 LIMIT 5)
>>> Entry.objects.all()[5:10]

# 不支持负索引,如 Entry.objects.all()[-1]

# 返回前10个对象中的第2、4、6、8、10个对象
>>> Entry.objects.all()[:10:2]

字段查询

字段查询即你如何制定 SQL WHERE 子句。它们以关键字参数的形式传递给 QuerySet 方法 filter(), exclude() 和 get()。

基本的查找关键字参数采用形式 field__lookuptype=value (使用双下划线,前面是字段名,后面是查询方式参数,查询ForeignKey时可以使用外键字段名_id)。

例子:

python 复制代码
>>> Entry.objects.filter(pub_date__lte="2006-01-01")

查询方式参数有:exact,iexact,contains,icontains,startswith,endswith等等

跨关系查询

为了跨越关系,跨模型使用关联字段名,字段名由双下划线分割,直到拿到想要的字段。

例子:

python 复制代码
# 检索所有具有 name 为 'Beatles Blog' 的 Blog 的 Entry 对象
>>> Entry.objects.filter(blog__name="Beatles Blog")

也可反向查询:

python 复制代码
# 检索所有至少有一个 headline 包含 'Lennon' 的 Entry 的 Blog 对象
>>> Blog.objects.filter(entry__headline__contains="Lennon")
相关推荐
我的xiaodoujiao6 分钟前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 24--数据驱动--参数化处理 Excel 文件 1
python·学习·测试工具·pytest
开心-开心急了21 分钟前
关于Flutter与Qt for python 的一些技术、开源、商用等问题
开发语言·python·qt·flutter
友友马23 分钟前
『 QT 』按钮类控件属性解析
开发语言·数据库·qt
vvw&30 分钟前
如何在 Ubuntu 上安装 PostgreSQL
linux·运维·服务器·数据库·ubuntu·postgresql
@小码农1 小时前
2025年北京海淀区中小学生信息学竞赛第一赛段试题(附答案)
人工智能·python·算法·蓝桥杯
qq_5470261791 小时前
Canal实时同步MySQL数据到Elasticsearch
数据库·mysql·elasticsearch
Q_Q19632884751 小时前
python+django/flask基于机器学习的就业岗位推荐系统
spring boot·python·django·flask·node.js·php
java1234_小锋2 小时前
REDIS集群会有写操作丢失吗?为什么
数据库·redis·缓存
兰若姐姐2 小时前
如何进行MSSQL提权?sp_oacreate、sp_oamethod和沙盒提权以及xp_regwrighte提权
数据库·sqlserver
一抓掉一大把2 小时前
秒杀-订单创建消费者CreateOrderConsumer
网络·数据库