1. # views.py
  2. 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. 创建对象:两步操作

  1. >>> b = Blog(name='Blog Name', tagline='All the news') # 创建对象
  2. >>> b.save() # 保存到数据库

1.2.2. 创建对象:create()

  1. b = Blog.objects.create(name='Blog Name', tagline='All the news')

无需执行 save()

1.2.3. 批量创建对象:bulk_create()

  1. Entry.objects.bulk_create([
  2. Entry(headline='This is a test'),
  3. Entry(headline='This is only a test'),
  4. ])

1.2.4. 保存对象:save()

  1. >>> b.name = 'New name'
  2. >>> b.save()
  3. 首先要获取 b 对象

1.2.5. 批量删除对象:delete()

  1. >>> Entry.objects.filter(pub_date__year=2005).delete()
  2. (5, {'webapp.Entry': 5})

返回:被删除对象总数量,和包含各种类型及数量的字典

1.2.6. 批量更新:update()

  1. # 链式
  2. Entry.objects.filter(pub_date__year=2007).update(headline='Every')
  3. # 更新外键
  4. >>> b = Blog.objects.get(pk=1)
  5. >>> Entry.objects.all().update(blog=b)

批量更新时,字段 auto_new 参数无效,如果想有效就用 for in

  1. for item in my_queryset:
  2. item.save()

1.3. 获取查询集及过滤

1.3.1. 表中所有数据:all()

all_entries = Entry.objects.all()

1.3.2. 所有数据中指定范围:all()[:5]

  1. >>> Entry.objects.all()[:5] # 前五个(缓存)
  2. >>> 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()

  1. one_entry = Entry.objects.get(pk=1)
  2. # pk 和 id 都为一个值时可以互用

异常(这些异常都是模型类的属性):

  1. 没有找到:DoesNotExist
  2. 找到多个:MultipleObjectsReturned

get() 参数与 filter() 一样(与 filter()[0] 不同的是,get() 如果没有找到对象会抛出 DoesNotExist 异常)

1.5. 查询集操作

1.5.1. 排序:order_by()

  1. >>> Entry.objects.order_by('headline')
  2. >>> Entry.objects.order_by('blog__name', 'headline') # 根据两个字段
  3. # 升序和降序
  4. User.objects.order_by('name') # 升序
  5. User.objects.order_by('-name') # 降序

1.5.2. 返回包含对象具体值的元组的QuerySet:values_list()

与values()类似,只是返回的是元组而不是字典。