Django ORM相关操作
官方文档:
https://docs.djangoproject.com/en/2.0/ref/models/querysets/
1.必须掌握的十三个方法
<1> all() 查询所有结果 <2> filter(**kwargs) 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs) 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一
个或者没有都会抛出错误 <4> exclude(**kwargs) 它包含了与所给筛选条件不匹配的对象 <5> values(*field) 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实
例化对象,而是一个可迭代的字典序列 <6> values_list(*field) 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <7> order_by(*field) 对查询结果排序 <8> reverse() 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用
(在model类的Meta中指定ordering或调用order_by()方法) <9> distinct() 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果
此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重) <10> count() 返回数据库中匹配查询(QuerySet)的对象数量 <11> first() 返回第一条记录 <12> last() 返回最后一条记录 <13> exists() 如果QuerySet包含数据,就返回True,否则返回False
分类:
1)返回QuerySet对象的方法
all()
filter()
exclude()
order_by()
reverse()
distinct()
values()
values_list()
2)返回具体对象
get()
first()
last()
3)返回布尔值
exists()
4)返回数字的方法
count()
2.ForeignKey,外键
示例:
from django.db import models # Create your models here. # 书 class Book(models.Model): title = models.CharField(max_length=32) publish_date = models.DateField(auto_now_add=True) price = models.DecimalField(max_digits=5, decimal_places=2) memo = models.TextField(null=True) # 创建外键,关联publish publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE, related_name='books') # 创建多对多关联author author = models.ManyToManyField(to="Author") def __str__(self): return self.title # 出版社 class Publisher(models.Model): name = models.CharField(max_length=32) city = models.CharField(max_length=32) def __str__(self): return self.name # 作者 class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() phone = models.CharField(max_length=11) detail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE) def __str__(self): return self.name # 作者详情 class AuthorDetail(models.Model): addr = models.CharField(max_length=64) email = models.EmailField()
说明:
因为建立每个模型也就是新建类的时候调用了__str__方法,所以通过类实例出对象时,默认返回该对象中指定的属性值
扫描二维码关注公众号,回复:
1693485 查看本文章
1)正向查找
对象查找---跨表查找
语法:
对象.关联字段.字段
# 获取书名为"七侠五义"的对象 obj = models.Book.objects.get(title='七侠五义') # 书籍和出版社间通关外键建立联表关系,可通过书籍对象跨表查询得到出版社的对象 print(obj.publisher) # 得到出版社对象的名称 print(obj.publisher.name)
字段查找---跨表查找
语法:
关联字段__字段
# 通过书籍对象获取对应出版社的名称和地址 ret = models.Book.objects.filter(title='七侠五义').values('publisher__name','publisher__city') print(ret)
2)反向操作
对象查找
语法:
对象.表名_set
# 获取出版社的名称 obj = models.Publisher.objects.get(name='南方传媒出版社') # 反向获取该出版社下的书籍 books = obj.book_set.all() print(books)
字段查找
语法:
表名__字段
# 反向获出版社下的书籍 ret = models.Publisher.objects.filter(name='南方传媒出版社').values('books__title') print(ret)
3.ManyToManyField,多对多
关联管理器是在一对多或者多对多的关联上下文中是使用的管理器
存在两种情况:
A.外键关系的反向查询
B.多对多关联关系
简单的说就是当点后面的对象---(针对对象操作)可能存在多个的时候就可以使用以下方法:
create(),创建一个新对象,保存对象,并将它添加到关联对象集之中,返回新建的对象
import datetime
# 通过获取到的第一个作者新建一个书籍对象 models.Author.objects.first().book_set.create(title='黑鹰传奇',
publish_date=datetime.date.today(),
price=100, publisher_id=1)
add(),把指定的model对象添加到关联的对象中
author_objs = models.Author.objects.filter(id__gt=2) print(author_objs) print(*author_objs) # 获取书籍对象,通过*打散获取到的QuerySet添加到书籍对象中 models.Book.objects.get(title='七侠五义').author.add(*author_objs)
添加ID
models.Book.objects.get(title='黑影传奇').author.add(*[3, 4, 7])
set(),更新model对象的关联对象
models.Book.objects.get(title='黑影传奇').author.set([3, 4])
remove(),从关联对象中移除
models.Book.objects.get(title='黑影传奇').author.remove(*[3, 4])
clear(),将关联的对象清除
models.Book.objects.get(title='黑影传奇').author.clear()
强调:
A.对于ForeignKey对象,clear()和remove()方法仅在null=True时才存在
示例:
不存在null=True时,没有clear()和remove()方法:
models.Publisher.objects.first().book_set.clear() Traceback (most recent call last): File "<input>", line 1, in <module> AttributeError: 'RelatedManager' object has no attribute 'clear'
B.对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法
4.聚合查询和分组查询
1)聚合