ORM多表操作--查询1

查询

正向与反向

正向查询:有外键关联字段的表开始查
反向查询: 没有关联字段的表开始查

基于对象的跨表查询-->子查询

两次select 查询 两次磁盘查询 效率低

 

一对一

正向: 对象.关联字段.属性
obj.authorDetail.addr
反向: 对象.小写表名.属性
obj.author.name

一对多

正向: 对象.关联字段.属性
obj.publishs.name
反向: obj.book_set.all() Queryset 集合

多对多

正向查询: obj.关联字段.all() 默认多个对象
obj.authors.all()
反向查询 obj.book_set.all()

基于双下划线的跨表查询 -- 连表 join

一对一

正向查询: 
obj = models.Author.objects.filter(name='小宝贝').values('authorDetail__telephone')
    print(obj)
反向查询
obj = models.AuthorDetail.objects.filter(author__name='小宝贝').values('telephone','author__age')
#查询电话号码是5555 的老师名称
正向:
obj = models.Author.objects.filter(authorDetail__telephone='5555').values('name')
反向:
obj = models.AuthorDetail.objects.filter(telephone='5555').values('author__name')

一对多

多 查 一 
1.查询三国演义这本书出资那个出版社
obj = models.Book.objects.filter(title='三国演义').values('publishs__name')
    print(obj)
    obj1 = models.Publish.objects.filter(book__title='三国演义').values('name')
    print(obj1)
一 查 多
#1号老男人出版社的书籍
    obj = models.Publish.objects.filter(id=1).values('book__title')
    print(obj)
    obj1 = models.Book.objects.filter(publishs__name='老男人出版社').values('title')
    print(obj1)

多对多

obj = models.Book.objects.filter(title='三国演义').values('authors__name')
    print(obj)
    obj1 = models.Author.objects.filter(book__title='三国演义').values('name')
    print(obj1)
    #id 2 写了那本书
obj = models.Author.objects.filter(pk=2).values('book__title')
    print(obj)
    obj1 = models.Book.objects.filter(authors__id=2).values('title')
    print(obj1)

进阶查询

 #查询三国演义书的出版社以及作者
    obj1 = models.Book.objects.filter(title='三国演义').values('publishs__name','authors__name')
    print(obj1)
    obj = models.Publish.objects.filter(book__title='三国演义').values('name','book__authors__name')
      obj = models.Author.objects.filter(book__title='三国演义').values('name','book__publishs__name')
    print(obj)
#手机号3开头的作者出版过得所有书籍名称以及出版社名称
    obj = models.AuthorDetail.objects.filter(telephone__startswith='3').values('author__book__title','author__book__publishs__name')
    print(obj)
    obj = models.Author.objects.filter(authorDetail__telephone__startswith='3').values('book__title','book__publishs__name')
    print(obj)
    obj = models.Book.objects.filter(authors__authorDetail__telephone__startswith='3').values('title','publishs__name')
    print(obj)

mysql 注释

--空格
related_name = 'xx',关系名称,反向查询时 小写表名用xx代替
obj = models.Publish.objects.filter(xx__title='李帅的床头故事').values('name')

聚合函数 Count,Max,Min,Sum,Avg

from django.db.models import Avg
聚合函数是query set 语句的结束符
Decimal('141.00'), 表示绝对精度 ,取值出来就是数字
obj = models.Book.objects.all().aggregate(a=Avg('price'),b=Max('price'),c=Sum('price'))
    print(obj)

原生mysql查询

#老男人出版社 出版的书的名称以及作者的名字
select app01_book.title,app01.author.name from app01_publish INNER JOIN app01_book on app01_book.publishs_id =
  app01_publish.id INNER JOIN app01_book_authors on app01_book.id =
app01_book_authors.book_id INNER JOIN app01_author on app01_author.id=
app01_book_authors.author_id where app01_publish.name = '老男人出版社';

添加外键 原生sql 栏位 外键名

alter table student add constraint 'xxx' foreign key('name')
references app01_book('id');
navcate 数据传输 --> 数据库迁移
导入,导出

 

posted @ 2021-04-15 11:19  苦行僧冬*婷  阅读(149)  评论(0)    收藏  举报