示例演示
QuerySet常规操作
创建模型类
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=50)
email = models.EmailField()
def __str__ (self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
常规操作
- QuerySet 创建对象的方法
from blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()
总之,一共有四种方法
From blog.models import Author
方法 1
Author.objects.create(name="Thompson", email="thompson@163.com")
方法 2
twz = Author(name=" Thompson", email=" thompson@163.com")
Python之:Django框架
奇酷学院高级讲师:郭建涛
twz.save()
方法 3
twz = Author()
twz.name=" Thompson"
twz.email=" thompson@163.com"
twz.save()
方法 4,首先尝试获取,不存在就创建,可以防止重复
Author.objects.get_or_create(name="WeizhongTu", email="tuweizhong@163.com")
返回值(object, True/False)
备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,(object,
True/False),创建时返回 True, 已经存在时返回 False
当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来
from blog.models import Entry
from datetime import *
entry = Entry()
entry.headline = 'headline'
entry.body_text = "body text"
entry.pub_date = datetime.now()
entry.mod_date = datetime.now()
entry.n_comments = 1
entry.n_pingbacks = 1
entry.rating = 1
entry.save()
entry.authors.add(author)
entry.save()
entry = Entry.objects.get(pk=1)
cheese_blog = Blog.objects.get(name="Cheddar Talk")
entry.blog = cheese_blog
entry.save()
- 获取对象的方法
查询所有
Entry.objects.all()
切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引
Entry.objects.all()[:10]
get是用来获取一个对象,多个会报错
Author.objects.get(name="Thompson")
如果需要获取满足条件的多个人,就要用到filter
Python之:Django框架
奇酷学院高级讲师:郭建涛
Author.objects.filter(name="abc")
Author.objects.filter(name__iexact="abc")
名称中包含 "abc"的人
Author.objects.filter(name__contains="abc")
名称中包含 "abc",且abc不区分大小写
Author.objects.filter(name__icontains="abc")
Author.objects.filter(name__regex="^abc") # 正则表达式查询
Author.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
- 删除符合条件的结果
得到满足条件的结果,然后 delete 就可以(危险操作,正式场合操作务必谨慎)
Author.objects.filter(name__contains="abc").delete() # 删除 名称中包含 "abc"的人
如果写成
people = Author.objects.filter(name__contains="abc")
people.delete()
效果也是一样的,Django实际只执行一条 SQL 语句。
- 更新某个内容
(1) 批量更新,适用于 .all() .filter() .exclude() 等后面 (危险操作,务必谨慎)
名称中包含 "abc"的人 都改成 xxx
Author.objects.filter(name__contains="abc").update(name='xxx')
(2) 单个 object 更新,适合get(), get_or_create(), update_or_create() 等得到的 obj,
和新建很类似。
twz = Author.objects.get(name="Tom")
twz.name="Tom"
twz.email="Tom@163.com"
twz.save() # 最后不要忘了保存!!!
- QuerySet 是可迭代的,比如:
es = Entry.objects.all()
for e in es:
print(e.headline)
Entry.objects.all() 或者 es 就是 QuerySet 是查询所有的 Entry 条目。
- 检查 Entry 中是否有对象
如果只是检查 Entry 中是否有对象
Entry.objects.all().exists()
QuerySet切片
Entry.objects.all()[:10] #取出10条,可以节省内存
查询集的数量
Entry.objects.count()
强行将 QuerySet 变成 列表
list(Entry.objects.all())
- QuerySet 查询结果排序
作者按照名称排序
Author.objects.all().order_by('name')
Author.objects.all().order_by('-name') # 在 column name 前加一个负号,可以实现倒序
- QuerySet 支持链式查询
Author.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com")
Author.objects.filter(name__contains="Wei").exclude(email="tuweizhong@163.com")
找出名称含有abc, 但是排除年龄是23 岁的
Person.objects.filter(name__contains="abc").exclude(age=23)
QuerySet进阶操作
创建模型类
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=50)
qq = models.CharField(max_length=10)
addr = models.TextField()
email = models.EmailField()
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=50)
author = models.ForeignKey(Author)
content = models.TextField()
score = models.IntegerField() # 文章的打分
tags = models.ManyToManyField('Tag')
def __str__(self):
return self.title
class Tag(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
比较简单,假设一篇文章只有一个作者(Author),一个作者可以有多篇文章(Article),一篇
文章可以有多个标签(Tag)。
values_list 获取元组形式结果
比如我们要获取作者的 name 和 qq
authors = Author.objects.values_list('name', 'qq')
使用list处理一下
list(authors)
如果只需要 1 个字段,可以指定 flat=True
Author.objects.values_list('name', flat=True)
values 获取字典形式的结果
比如我们要获取作者的 name 和 qq
Author.objects.values('name', 'qq')
list(Author.objects.values('name', 'qq'))
Article.objects.filter(author__name='twz915').values('title')
注意:
values_list 和 values 返回的并不是真正的 列表 或 字典,也是 queryset,他们也是
lazy evaluation 的(惰性评估,通俗地说,就是用的时候才真正的去数据库查)如果查询后没有使用,在数据库更新后再使用,你发现得到在是新内容!!!如果想要旧
内容保持着,数据库更新后不要变,可以 list 一下如果只是遍历这些结果,没有必要 list 它们转成列表(浪费内存,数据量大的时候要更
谨慎!!!)