当前位置: 首页 > news >正文

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

检索对象

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

from datetime import datefrom django.db import modelsclass Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=200)email = models.EmailField()def __str__(self):return self.nameclass 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

检索全部对象

>>> all_entries = Entry.objects.all()

通过过滤器检索指定对象

通过添加过滤条件精炼原始 QuerySet。两种最常见的精炼 QuerySet 的方式是:
filter(**kwargs)
返回一个新的 QuerySet,包含的对象满足给定查询参数。
exclude(**kwargs)
返回一个新的 QuerySet,包含的对象 不 满足给定查询参数。
由此可见,对 QuerySet 进行细化的结果本身也是一个 QuerySet,因此可以将细化操作链接在一起。
QuerySets 是惰性的 —— 创建 QuerySet 的过程不涉及任何数据库活动。你可以一直堆叠过滤条件,但 Django 实际上不会运行查询,直到 QuerySet 被评估

检索单个对象

>>> one_entry = Entry.objects.get(pk=1)

QuerySet条目数限制

QuerySet是一个对象列表,因此类似python数组切片,可以对条目数进行限制,但是也有区别,不支持负索引。
通常对 QuerySet 进行切片会返回一个新的 QuerySet,它不会评估查询。但是如果使用了 Python 切片语法的 “step” 参数,会实际执行查询。
例子:

# 返回前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)。
例子:

>>> Entry.objects.filter(pub_date__lte="2006-01-01")

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

跨关系查询

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

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

也可反向查询:

# 检索所有至少有一个 headline 包含 'Lennon' 的 Entry 的 Blog 对象
>>> Blog.objects.filter(entry__headline__contains="Lennon")
http://www.lryc.cn/news/309035.html

相关文章:

  • Python:练习:编写一个程序,写入一个美金数量,然后显示出如何用最少的20美元、10美元、5美元和1美元来付款
  • 模板方法模式 详解 设计模式
  • Node.js_基础知识(http模块)
  • matlab工具包
  • UCSF DOCK 分子对接详细案例(01)- rigid, fixed anchor, flexible dock
  • java基础(4)注解,集合,
  • 基于springboot+vue的大学城水电管理系统(前后端分离)
  • 代码随想录算法训练营第四十六天| 139.单词拆分、卡码网第56题
  • Redis 在 Linux 系统下安装部署的两种方式详细说明
  • 【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)
  • Webserver解决segmentation fault(core dump)段错问问题
  • 存储过程基本了解
  • 『大模型笔记』RAG应用的12种调优策略指南
  • leedcode刷题--day7(字符串)
  • 【蓝桥杯省赛真题31】python连续正整数之和 中小学青少年组蓝桥杯比赛python编程省赛真题解析
  • 【116个】网络安全测试相关面试真题
  • 微服务day02-Ribbon负载均衡与Nacos安装与入门
  • 深度学习-神经网络原理
  • Chat GPT:智能对话的下一步
  • [数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别
  • RabbitMQ实战学习
  • 插混、油混、增程式、轻混、强混,啥区别
  • React 模态框的设计(八)优化补充
  • 知识积累(三):深度学习相关概念(查看检索时看到)
  • 计算机专业必看的几部电影
  • 工业人工智能需要注意的10件事
  • 软考-系统集成项目管理中级-信息系统建设与设计
  • C++从零开始的打怪升级之路(day39)
  • Java面试题之并发
  • Python GUI自动化定位代码参考