1 ORM添加
1.1 一对多添加
方式一:
pub_obj=Publish.objects.get(id=2) Book.objects.create(title="python",publisher=pub_obj)
方式二:
Book.objects.create(title="python",publisher_id=2)
1.2 多对多添加
1.2.1 绑定关系
方式一:
book_obj=models.Book.objects.create(title="python") author1=models.Author.objects.get(name="jack") author2=models.Author.objects.get(name="tom") book_obj.authors.add(author1,author2)
方式二:
book_obj=models.Book.objects.create(title="python") author_list=models.Author.objects.all() book_obj.authors.add(*author_list)
1.2.2 解除关系
book_obj=models.Book.objects.get(title="python") author1=models.Author.objects.get(name="jack") book_obj.authors.remove(author1)
或者解除所有关系
book_obj.authors.clear()
2 ORM查询
2.1 一对多查询
2.1.1 正向查询
正向查询按字段,进行查询
book_obj=models.Book.objects.filter(title="python").first pub_name=book_obj.publisher.name # publisher object : 与这本书关联的出版社对象 pub_addr=book_obj.publisher.addr
2.1.2 反向查询
反向查询,按照表名(小写)_set,进行查询
pub_obj=models.Publish.objects.get(name="机械出版社") book_list=pub_obj.book_set.all() # 与这个出版社关联的所有书籍对象
2.2 多对多查询
2.2.1 正向查询
多对多正向查询,按字段进行查询
book_obj=models.Book.objects.filter(title="python").first() author_list=book_obj.authors.all()
2.2.2 反向查询
多对多的反向查询,按关联的表名(小写)_set
author1=model.Author.objects.get(name="jack") book_list=author1.book_set.all()
2.3 一对一查询
2.3.1 正向查询
一对一正向查询,按字段进行查询
# 查询addr在北京的作者 authorDetail=models.AuthorDetail.objects.get(addr="bj") author_name=authorDetail.author.name
2.3.2反向查询
一对一的反向查询,按表名(小写)
author1=models.Author.objects.get(name="jack") addr=author1.authordetail.addr
2.4 基于双下划线跨表查询
# 查询python这本书的价格 ret=models.Book.objects.filter(title="python").values("price","title") print(ret) # <QuerySet [{'price': Decimal('122.00')}]> #查询python这本书的出版社的名称和地址 # 1.正向查询 按字段 基于book表 ret=models.Book.objects.filter(title="python").values_list("publisher__name") print(ret) # 2.反向查询 按表名 if 设置了related_name: 按设置值 ret=models.Publish.objects.filter(bookList__price=333).values_list("name","addr").distinct() print(ret) # 查询人民出版社出版过的所有书籍名称及价格 ret=models.Book.objects.filter(publisher__name="机械出版社").values("title","price") print(ret.count()) ret=models.Publish.objects.filter(name="renmin").values("bookList__title","bookList__price") print(ret.count()) #查询jack出过的所有书籍的名字(多对多) ret=models.Author.objects.filter(name="jack").values_list("book__title") print(ret) ret=models.Book.objects.filter(authors__name__contains="eg").values("title") print(ret) # 地址以沙河开头的的作者出版过的所有书籍名称以及出版社名称 ret=models.Book.objects.filter(authors__authordetail__addr__startswith="sha").values("title","publisher__name") print(ret)
3 聚合与分组
3.1 聚合
from django.db.models import Avg,Count,Sum,Min,Max # 单纯聚合函数 # 计算所有图书的平均价格 ret=models.Book.objects.all().aggregate(priceSum=Sum("price")) print(ret) # {'priceSum': Decimal('2158.00')}
3.2 分组
# 统计每一本书的作者个数 ret=models.Book.objects.all().annotate(authors_num=Count("authors")) # QuerySet print(ret) # [book_obj1,book_obj2,book_obj3,book_obj4,....] # 查询每一个出版社出版过的所有书籍的总价格 #方式1: ret3=models.Publish.objects.all().annotate(priceSum=Sum("bookList__price")) ret4 = models.Publish.objects.all().annotate(priceSum=Sum("bookList__price")).values("name","priceSum") # 方式2: ret5=models.Book.objects.all().values("publisher__name").annotate(priceSum=Sum("price")).values("publisher__name","priceSum")
4 F与Q查询
4.1 F查询
from django.db.models import F,Q ret=models.Book.objects.filter(comment_num__gt=F("read_num")*2) models.Book.objects.all().update(price=F("price")+10)
4.2 Q查询
from django.db.models import F,Q ret=models.Book.objects.filter(comment_num__gt=50,read_num__gt=50) ret=models.Book.objects.filter(Q(comment_num__gt=100)|Q(read_num__gt=100))
5 ORM修改
1.obj.name="jack"
obj.save() # 效率低
2.表.objects.all().update(name="jack") # 推荐方法
注意:update方法是QuerySet数据类型的方法
6 ORM删除
表.objects.filter(条件).delete()
注意事项:
1.delete是QuerySet数据类型的方法
2.delete是级联删除