首页 > 其他分享 >django多表查询

django多表查询

时间:2023-02-27 20:33:05浏览次数:46  
标签:__ 多表 name objects publish 查询 book django

 

 

注意事项:

  •  表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称  
  •  id 字段是自动添加的
  •  对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名
  •  这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。
  •  定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。
  • 外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None 。

二 添加表记录

一对多的

方式1:
publish_obj=Publish.objects.get(nid=1)
book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish=publish_obj)

方式2:
book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish_id=1)

三 基于对象的跨表查询

一对多查询(publish与book)

正向查询(按字段:publish)

# 查询主键为1的书籍的出版社所在的城市
book_obj=Book.objects.filter(pk=1).first()
# book_obj.publish 是主键为1的书籍对象关联的出版社对象
print(book_obj.publish.city)

反向查询(按表名:book_set)

publish=Publish.objects.get(name="苹果出版社")
#publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合
book_list=publish.book_set.all()    
for book_obj in book_list:
       print(book_obj.title)
View Code

一对一查询(Author 与 AuthorDetail)

正向查询(按字段:authorDetail):

egon=Author.objects.filter(name="egon").first()
print(egon.authorDetail.telephone)

反向查询(按表名:author):

# 查询所有住址在北京的作者的姓名
 
authorDetail_list=AuthorDetail.objects.filter(addr="beijing")
for obj in authorDetail_list:
     print(obj.author.name)

四 基于双下划线的跨表查询

Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的model 为止。

'''
    正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表
'''

一对多查询

复制代码
# 练习:  查询苹果出版社出版过的所有书籍的名字与价格(一对多)

    # 正向查询 按字段:publish

    queryResult=Book.objects
            .filter(publish__name="苹果出版社")
            .values_list("title","price")

    # 反向查询 按表名:book

    queryResult=Publish.objects
              .filter(name="苹果出版社")
              .values_list("book__title","book__price")
查询的本质一样,就是select from的表不一样
复制代码 View Code

多对多查询 

复制代码
# 练习: 查询alex出过的所有书籍的名字(多对多)

    # 正向查询 按字段:authors:
    queryResult=Book.objects
            .filter(authors__name="yuan")
            .values_list("title")

    # 反向查询 按表名:book
    queryResult=Author.objects
              .filter(name="yuan")
              .values_list("book__title","book__price")
复制代码   View Code

 

一对一查询

复制代码
# 查询alex的手机号
    
    # 正向查询
    ret=Author.objects.filter(name="alex").values("authordetail__telephone")

    # 反向查询
    ret=AuthorDetail.objects.filter(author__name="alex").values("telephone")
复制代码 View Code

进阶练习(连续跨表)

复制代码
# 练习: 查询人民出版社出版过的所有书籍的名字以及作者的姓名


    # 正向查询
    queryResult=Book.objects
            .filter(publish__name="人民出版社")
            .values_list("title","authors__name")
    # 反向查询
    queryResult=Publish.objects
              .filter(name="人民出版社")
              .values_list("book__title","book__authors__age","book__authors__name")


# 练习: 手机号以151开头的作者出版过的所有书籍名称以及出版社名称


    # 方式1:
    queryResult=Book.objects
            .filter(authors__authorDetail__telephone__regex="151")
            .values_list("title","publish__name")
    # 方式2:    
    ret=Author.objects
              .filter(authordetail__telephone__startswith="151")
              .values("book__title","book__publish__name")

查询练习

练习:统计每一本书作者个数

复制代码
from django.db.models import Avg, Max, Sum, Min, Max, Count
book_list = models.Book.objects.all().annotate(author_num=Count("authors"))
for book in book_list:
     print(book.name)
     print(book.author_num)
book_list = models.Book.objects.all().annotate(author_num=Count("authors")).values('name','author_num')
print(book_list)
复制代码

 练习:统计每一个出版社的最便宜的书

publishList=Publish.objects.annotate(MinPrice=Min("book__price"))
for publish_obj in publishList:
    print(publish_obj.name,publish_obj.MinPrice)

annotate的返回值是querySet,如果不想遍历对象,可以用上valuelist:

queryResult= Publish.objects.annotate(MinPrice=Min("book__price")).values_list("name","MinPrice")
print(queryResult)

  练习:统计每一本以py开头的书籍的作者个数:

 queryResult=Book.objects.filter(title__startswith="Py").annotate(num_authors=Count('authors'))

  练习:统计不止一个作者的图书:(作者数量大于一)

ret=models.Book.objects.annotate(author_num=Count("authors")).filter(author_num__gt=1).values('name','author_num')
print(ret)

 练习:根据一本图书作者数量的多少对查询集 QuerySet进行排序:

Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')

  练习:查询各个作者出的书的总价格:

ret=models.Author.objects.annotate(sum_price=Sum("book__price")).values("name", "sum_price")
print(ret)

  练习:查询每个出版社的名称和书籍个数

ret=models.Publish.objects.all().annotate(c=Count('book__name')).values('name','c')
print(ret)

标签:__,多表,name,objects,publish,查询,book,django
From: https://www.cnblogs.com/vless/p/17161791.html

相关文章

  • DQL基础查询/条件查询
    基础查询:selectname,agefromstu; --查两列select * from stu;--查全部,不推荐selectdistinctaddressfromstu;--......
  • django配置文件
    frompathlibimportPathimportosimportsys#项目根路径#我们就是要让小路飞路径作为项目根路径BASE_DIR=Path(__file__).resolve().parent.parent#项目根......
  • 16.Django的信号
    Django中的信号就是字面意思,当发送某个信号的时候,就会触发一个或者多个函数的执行,例如,当我们每次发送短信的时候,我们可能需要将验证码保存在redis中,同时需要记录在log中,此......
  • Linux操作系统下查询NVMe盘符、Slot ID和Bus ID的对应关系
    在拆卸NVMePCIe固态硬盘时,需要查询Linux操作系统下NVMe盘符、SlotID和BusID的对应关系。操作步骤打开操作系统命令终端。依次执行cd/sys/bus/pci/slots和ll命令,找到......
  • mysql开启慢查询日志
    前言:mysql数据库默认没有开启慢查询日志,需要我们手动去设置这个参数;慢查询,它的主要作用是定位那些执行时间比较长的sql语句,运行时间超过long_query_time值的SQL(long_query_......
  • Luffy后台Django项目创建
    一、准备环境1.创建luffy项目虚拟环境mkvirtualenvluffy2.安装项目基础依赖#1.安装Djangopipinstalldjango==3.2.2#2.安装djangorestframeworkpipinstalldja......
  • mysql查询近N天的数据
    今天select*from表名whereto_days(时间字段名)=to_days(now());昨天SELECT*FROM表名WHERETO_DAYS(NOW())-TO_DAYS(时间字段名)<=17天SELECT*F......
  • MySQL根据经纬度和距离查询最近的数据
    [lat]:输入的纬度[lon]:输入的经度[distance]:查询距离内的数据,单位mSELECT*FROM(SELECTidlon,lat......
  • db2 模糊查询
    今天在书写接口的时候遇到一个问题,查询接口需要模糊查询,我在百度上搜索mybatils的模糊查询不行,最后发现,mysql的模糊查询concat方法和db2的不一样。然后就找到领一种方法,使......
  • SQL SERVER 生僻字查询问题和关键字COLLATE
       先说问题,生僻字查询的问题,有的时候我们的数据里包含一些生僻字,在查询用Like模糊匹配的时候,发现有的查询不准确,测试数据如下:1--测试数据2ifnotobject_id(N'......