Django-官网查询部分翻译(1.11版本文档)-QuerySet-字段查找-06
发布日期:2021-05-14 13:55:07 浏览次数:18 分类:精选文章

本文共 1988 字,大约阅读时间需要 6 分钟。

Django ORM 模型层基础教程


1. 模型层概述

Django 的 ORM(对象关系映射)允许你通过 Python 代码与数据库进行交互。模型类代表数据库表,模型实例代表表中的一条记录。以下是创建一个简单模型的示例:

from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name

模型类特点

  • 每个模型类代表一张数据库表
  • 模型实例代表表中的一条记录
  • ORM自动管理数据库操作,简化数据库编程

2. 创建对象

创建一个新对象

from blog.models import Blog
# 创建一个 Blog 实例
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
# 保存到数据库
b.save()

注意save() 方法不会直接执行数据库语句,直到真正调用为止。


保存修改

b5.name = 'New name'
b5.save() # 更新数据库

3. 外键字段操作

更新外键

from blog.models import Blog, Entry
# 假设 `entry` 已存在于数据库
cheese_blog = Blog.objects.get(name="Cheddar Talk")
entry.blog = cheese_blog
entry.save()

多对多字段操作

from blog.models import Author, Entry
# 创建 Author 实例
joe = Author.objects.create(name="joe")
# 将 joe 添加到 Entry 的多对多字段中
entry.authors.add(joe)

插入多个多对多字段

john = Author.objects.create(name="John")
paul = Author.objects.create(name="Paul")
entry.authors.add(john, paul)

4. 数据库查询

查询所有记录

all_entries = Entry.objects.all()
# all_entries 是一个 QuerySet 对象

根据条件查询

# 查询 2006 年发表的_entries
Entry.objects.filter(pub_date__year=2006)

链式查询

# 查询标题以 "What" 开头,并按日期排序的_entries
Entry.objects.filter(headline__startswith="What").order_by("pub_date")

QuerySet 的特点

  • 惰性:QuerySet 不会立即执行数据库操作,只有在访问(如 print)时才会取数据
  • 独立:每次查询都会生成一个新的 QuerySet 对象
  • 缓存依存:查询结果会被缓存,减少重复数据库操作

使用 .get() 查询单个对象

# 根据主键查找
one_entry = Entry.objects.get(pk=1)

注意

  • .get() 会抛出 DoesNotExist 错误,若记录不存在
  • .filter([0]) 也可以用来查找单个对象

5. 其他 QuerySet 方法

  • .exclude():排除满足条件的记录
  • .annotate():对查询结果进行分组和聚合
  • .order_by():对结果进行排序
  • .distinct():去重
  • .values():提取特定字段的值
  • .none():创建一个空的 QuerySet

6. 聚合函数

使用聚合函数(如 annotate)可以对查询结果进行汇总统计:

# 统计每个 Blog 的评论数量
from django.db.models import Count
Blog.objects.annotate(
num_comments=Count('entry', filter_set=Entry.objects.filter(n_comments__gte=10)
).filter(tagline__contains='博客')

总结

Django 的 ORM 提供了强大的查询功能,通过 QuerySet 操作可以方便地与数据库交互。结合 .filter() 和链式调用,你可以对数据库数据进行复杂的筛选和聚合操作,从而提升开发效率。

上一篇:Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08
下一篇:jquery

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月16日 07时40分29秒