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是级联删除

最新文章

  1. Android学习资源整理
  2. C# DataGridView绑定数据源
  3. Testing - 测试基础 - 用例
  4. Openwrt笔记-IPv6与启动顺序
  5. UIButton在不同状态下显示不同背景色
  6. Jnotify文件监控的用法以及Jar文件导入的方法
  7. MySql的导入与导出
  8. 【HDU 4436】 str2int (广义SAM)
  9. service structure flowchart [mobile to server via HTTP RESTful API and TCP/IP in a map]
  10. POJ3254(入门状态压缩dp)
  11. vue移动端框架到底哪家强
  12. 用 volume container 共享数据 - 每天5分钟玩转 Docker 容器技术(42)
  13. Springboot文件上传与下载
  14. springBoot使用@Value标签读取*.properties文件的中文乱码问题
  15. MySQL(4)---慢查询
  16. kubernetes1.5.2 dashboard配置
  17. 个人爱好:idea 项目结构呈现风格
  18. Linux-Ubuntu16.0.4相关命令
  19. 分部视图在ASP.NET MVC中的应用
  20. 【JQuery】JQuery属性

热门文章

  1. HDU 1045 Fire Net (深搜)
  2. 大图片上传(ImageIO,注意有的图片不能上传时因为他是tiff格式)
  3. 安全测试===dos攻击和ddos攻击
  4. 62.Unique Paths---dp
  5. caffe Python API 之BatchNormal
  6. vue单选,多选,多选的内容显示在页面可删除
  7. Transport failed: java.io.EOFException
  8. Linux系统调优及安全设置
  9. [ python ] 字典的使用
  10. linux下C语言编程,include的默认搜索路径