zoukankan      html  css  js  c++  java
  • ORM跨表查询

    首先,在项目中添加我们要查询的模型,并插入数据

    View Code

    在django根目录下创建一个查询的py文件,供我们测试

    View Code

     

    ORM跨表查询可以分为基于  对象的查询(子查询)  基于 queryset(双下划线__) 的查询

     

    基于对象的查询(子查询)

    一对多的查询

    正向查询:在有关联字段的表向被关联的表查询

    一对多的正向查询(正向查询按字段)

    查询名为 python开天辟地 这本书的出版社的邮箱

    book_obj = models.Book.objects.filter(title="python开天辟地").first()
    print(book_obj.publish.email)

    一对多的反向查询(先查出1的这个对象,然后表名小写_set,查询与这个对象关联的对象)

    查询名为朝阳门的出版社出版过的所有书籍名称

    publish_obj = models.Publish.objects.filter(name="朝阳门出版社").first()
    for book in publish_obj.book_set.all():
        print(book.title)

    多对多的查询

    多对多的正向查询

    查询名为python开天辟地的这本书的作者的年龄

    book_obj = models.Book.objects.filter(title="python开天辟地").first()
    for author in book_obj.author.all():
        print(author.name,author.age)

    多对多的反向查询

    查询作者呲花出版的所有书籍的名字

    author_obj = models.Author.objects.filter(name="呲花").first()
    for book in author_obj.book_set.all():
        print(book.title)

    一对一的查询

    一对一正向查询

    查询作者狗城的手机号

    author_obj = models.Author.objects.filter(name="狗城").first()
    print(author_obj.authorDetail.telephone)

    一对一反向查询

    查询手机号是17777777777的作者是谁(一对一反向查询,直接表名就可以,不用跟_set)

    authordetail_obj = models.AuthorDetail.objects.filter(telephone=17777777777).first()
    print(authordetail_obj.author.name)

    基于queryset的查询

    本质上是join关联表查询

    一对多的正向查询(字段加__要查询的属性)

    查询书名python开天辟地这本书的出版社的邮箱

    models.Book.objects.filter(title="python开天辟地").values("publish__email")

    一对多的反向查询(values里边要查询的表名小写加__要查询的属性)

    查询名为朝阳门的出版社出版过的所有书籍名称

    方式一:

    book_list = models.Publish.objects.filter(name="朝阳门出版社").values("book__title")
    for book in book_list:
        print(book["book__title"])

     方式二:

    book_list = models.Book.objects.filter(publish__name="朝阳门出版社").values("title")  # 过滤所有书籍里出版社的名字
    for book in book_list:
        print(book["title"])

    查询手机号以177开头的作者出版的书籍以及书籍对应的出版社名称

    这种多表关联查询,首先定位基表(book),然后通过跨表双下划线,组合成一张大表,通过条件筛选

    print(models.Book.objects.filter(author__authorDetail__telephone__startswith="177").values("title", "publish__name"))

    聚合查询

    聚合查询需要用到的内置函数

    from django.db.models import Avg, Sum, Max, Min, Count

    查询书籍列表中所有书籍的价格总和

    models.Book.objects.all().aggregate(Sum("price"))

    可以为聚合的值命名,像这样

    models.Book.objects.all().aggregate(sum_price = Sum("price"))

    在一条语句中,查询多个聚合值

    models.Book.objects.all().aggregate(sum_price=Sum("price"), max_price=Max("price"), min_price=Min("price"))

    分组查询

    vlaues()里边是什么字段,就根据什么字段分组

    查询每个书籍的作者的个数

    models.Book.objects.all().annotate(num_author = Count("author"))

    查询出每个出版社最便宜的书籍的名称和价格

    方式一:

    models.Publish.objects.all().annotate(min_price = Min("book__price"))

    方式二:

    models.Book.objects.values("publish__name").annotate(min_price = Min("price"))
  • 相关阅读:
    JavaScript 垃圾回收
    JavaScript 跳坑指南
    javaScript AJAX
    高效 JavaScript
    Java使用 Thumbnails 压缩图片
    Vue前端压缩图片
    JS input输入框字数超出长度显示省略号.....
    Vue图片浏览组件vviewer使用
    浏览器获取京东cookie
    图片在容器内水平垂直居中显示
  • 原文地址:https://www.cnblogs.com/ligiao/p/11159273.html
Copyright © 2011-2022 走看看