# views.py
from .models import ModelName # 首先需要引入操作的模型
数据库API在视图中使用
1. 常用API
1.1. 【速查表单】
操作 | API |
---|---|
增删修改 | |
创建对象 | create() |
批量创建对象 | bulk_create() |
保存对象 | save() |
批量删除对象 | delete() |
批量更新 | update() |
没找到更新对象就创建 | update_or_create() |
获取查询集及过滤 | |
表中所有数据 | all() |
所有数据中指定范围 | all()[:5] |
返回指定参数查询内容 | filter() |
返回除了制定参数查询内容 | exclude() |
获取单一对象 | |
获取单一对象 | get() |
没找到就创建 | get_or_create() |
查询集操作 | |
排序 | order_by() |
反向排序 | reverse() |
去重 | distinct() |
统计对象的个数 | count() |
获取最近的对象 | latest() |
获取最早的对象 | earliest() |
获取第一个对象 | first() |
获取最后一个对象 | last() |
判断queryset中是否有对象 | exists() |
返回包含对象具体值的字典的QuerySet | values() |
返回包含对象具体值的元组的QuerySet | values_list() |
创建空的查询集 | none() |
使用聚合函数 | annotate() |
聚合操作 | aggregate() |
1.2. 增删修改
1.2.1. 创建对象:两步操作
>>> b = Blog(name='Blog Name', tagline='All the news') # 创建对象
>>> b.save() # 保存到数据库
1.2.2. 创建对象:create()
b = Blog.objects.create(name='Blog Name', tagline='All the news')
无需执行 save()
1.2.3. 批量创建对象:bulk_create()
Entry.objects.bulk_create([
Entry(headline='This is a test'),
Entry(headline='This is only a test'),
])
1.2.4. 保存对象:save()
>>> b.name = 'New name'
>>> b.save()
首先要获取 b 对象
1.2.5. 批量删除对象:delete()
>>> Entry.objects.filter(pub_date__year=2005).delete()
(5, {'webapp.Entry': 5})
返回:被删除对象总数量,和包含各种类型及数量的字典
1.2.6. 批量更新:update()
# 链式
Entry.objects.filter(pub_date__year=2007).update(headline='Every')
# 更新外键
>>> b = Blog.objects.get(pk=1)
>>> Entry.objects.all().update(blog=b)
批量更新时,字段 auto_new 参数无效,如果想有效就用 for in
for item in my_queryset:
item.save()
1.3. 获取查询集及过滤
1.3.1. 表中所有数据:all()
all_entries = Entry.objects.all()
1.3.2. 所有数据中指定范围:all()[:5]
>>> Entry.objects.all()[:5] # 前五个(缓存)
>>> Entry.objects.all()[:10:2] # 按步长(数据库)
不支持负索引
1.3.3. 返回指定参数查询内容:filter()
Entry.objects.filter(pub_date__year=2006)
参数格式必须是 Django 设置的字段格式
1.3.4. 返回除了制定参数查询内容:exclude()
Entry.objects.exclude(pub_date__year=2006)
参数设置同上
1.4. 获取单一对象
1.4.1. 获取单一对象:get()
one_entry = Entry.objects.get(pk=1)
# pk 和 id 都为一个值时可以互用
异常(这些异常都是模型类的属性):
- 没有找到:DoesNotExist
- 找到多个:MultipleObjectsReturned
get() 参数与 filter() 一样(与 filter()[0] 不同的是,get() 如果没有找到对象会抛出 DoesNotExist 异常)
1.5. 查询集操作
1.5.1. 排序:order_by()
>>> Entry.objects.order_by('headline')
>>> Entry.objects.order_by('blog__name', 'headline') # 根据两个字段
# 升序和降序
User.objects.order_by('name') # 升序
User.objects.order_by('-name') # 降序
1.5.2. 返回包含对象具体值的元组的QuerySet:values_list()
与values()类似,只是返回的是元组而不是字典。