本编博客前言总结,
在一对多,和多对多的查询,有 表名_set 方法,和 表名__(双下划綫)字段名 方法。
表名_set 方法 :用于反向查询,
表名__(双下划綫)字段名 :最为一个条件查询
===========
在views视图函数中,利用双下划线的单表查询,
id__gt=2 ,id大于2的字段值都打印出来
title__contains='python‘,关键字查询,包含python的title字段都打印出来
def query(request): #双下划线--- 单表查询 query_list = Publish.objects.filter(id__gt=1)#查询id大于1的出版社 # print(query_list) #<QuerySet [<Publish: 河下出版社 洛阳>, <Publish: 清华出版社 北京>, <Publish: 人民出版社 昌平>]> #包含contains ,写上关键字 book = Book.objects.filter(title__contains='兰')#得到可能是一个集合对象,包含多个对象 # print(book) #<QuerySet [<Book: 项塔兰>]> return HttpResponse('oookkk')
-----
values() 方法,查询字段的值,得到一个字典格式,key字段,value是对应的值
# values 查询方法,就是字段对应的值, def query_value(request): b1 = Book.objects.values('title')#title值字段 # print(b1) #得到QuerySet集合是所有的记录,,里面是字典,key是字段,value是值, #< QuerySet[{'title': 'Linux'}, {'title': '项塔兰'}, {'title': '追风筝的人'}, {'title': '富爸爸'}] > b2 = Book.objects.values('title','price')#可以加多个字段 # print(b2) #< QuerySet[{'title': 'Linux', 'price': Decimal('30.00')}, # {'title': '项塔兰', 'price': Decimal('45.00')}, # {'title': '追风筝的人', 'price': Decimal('39.90')}, # {'title': '富爸爸', 'price': Decimal('23.00')}] > b3 = Book.objects.filter(id__gt=4).values('title')#查询id大于4,的title,得到一个对象集合,显示书名 #<QuerySet [{'title': '富爸爸'}]> # print(b3)
----
values_list()方法,得到是元组形式字段值
exclude()排除括号里的,条件,
# ----valuelist 方法查询 ,得到一个元组格式数据,只有字段的值, b4 = Book.objects.filter(id__gt=3).values_list('title') # print(b4) #得到一个 #<QuerySet [('追风筝的人',), ('富爸爸',)]> b5 = Book.objects.exclude(id__gt=3)#exclude 排除 ,查询id大于4的以外的书籍,<QuerySet [<Book: Linux>, <Book: 项塔兰>]> b6 = Book.objects.filter(id__lt=4)# 查询id小于4 的书籍 <QuerySet [<Book: Linux>, <Book: 项塔兰>]> # print(b5) # print(b6) #b5 和b6 得到结果一样,
----
一对多,多对多,正向查询和方向查询
2张表产生关系一张表有关联表的字段,查询关联表就是正向
另一张没有关联的字段,但已经有关联关系,就可以方向查询,用 要查的表名的小写__set就可以
def relationquery(request): #一对多的关系查询,先得到多的对象,然后调用关联的 一 的表的字段,就得到字段的值, #查询Linux的出版社的地址 book_obj = Book.objects.filter(title = "linux")[0] #book_obj.publish是一条出版社对象,然后调用自己的属性,就是自己的字段 print(book_obj.publish.addr)#北京 #用sql语句查询,子查询,把一个结果作为一个条件查询 #select addr from publish where id=(select publish_id from Book where title='linux') #多对多的查询 #找Linux这本书的所有作者名字 linux_obj = Book.objects.filter(title = 'linux').first() #利用Book表中authors表,获取所有的对象 author_list = linux_obj.authors.all() # for obj in author_list: #循环得到每个对象的名字 # print(obj.name) # egon # alex # yuan # oldboy #反向查询,出版社没有书籍表的字段,用反向查询- _set #查询北京出版社出版的所有书籍 pub = Publish.objects.filter(name = '北京出版社')[0] # print(pub.book_set.all())#<QuerySet [<Book: Linux>]> #正向查 pid = Publish.objects.filter(name = '北京出版社')[0] # print(Book.objects.all(publish_id=pid))#<QuerySet [<Book: Linux>]> #反向绑定 # author1 = Author.objects.add(name = 'yuan') # # author1.book_set.add(*Book.objects.all())#给yuan 绑定了所有的书籍关系
values ,filter,和双下划线的使用,多对多表的表查询,一对多表查询
#value ,filter,双下划线,使用 #查询Linux出版社的地址 #publish__addr,publsih是Book表的字段,__ 是固定语法,addr是PUblish字段 ret2 = Book.objects.filter(title='linux').values('publish__addr') print(ret2)#<QuerySet [{'publish__addr': '北京'}]> #查询Linux的所有作者 ret3 = Book.objects.filter(title='linux').values('authors__name') print(ret3) #<QuerySet [{'authors__name': 'egon'}, {'authors__name': 'alex'}, {'authors__name': 'yuan'}, {'authors__name': 'oldboy'}]>
一对多,多对多的反向查询
#用反向的方法查一对多, #用PUblish表查询出版过Linux这本书的出版社名字,用反向查book__title,book 是Book表的表名小写,加上Book表的字段 ret3 = Publish.objects.filter(book__title='linux').values('name') # print(ret3)#<QuerySet [{'name': '北京出版社'}]> #用反向的方法查询多对多 # 查询Linux的所有作者的名字 ret4 = Author.objects.filter(book__title='linux').values('name') # print(ret4)#<QuerySet [{'name': 'egon'}, {'name': 'alex'}, {'name': 'yuan'}, {'name': 'oldboy'}]> #正向查询 #查询Linux的所有作者 ret3 = Book.objects.filter(title='linux').values('authors__name') # print(ret3) #<QuerySet [{'authors__name': 'egon'}, {'authors__name': 'alex'}, {'authors__name': 'yuan'}, {'authors__name': 'oldboy'}]> #查询书籍价格大于40的作者 #正向 ret5 = Book.objects.filter(price__gt=40).values('authors__name') print(ret5) #<QuerySet [{'authors__name': 'egon'}, {'authors__name': 'alex'}, {'authors__name': 'yuan'}, {'authors__name': 'yuan'}, {'authors__name': 'oldboy'}]> #反向 ret6 = Author.objects.filter(book__price__gt=40).values('name') print(ret6) #<QuerySet [{'name': 'egon'}, {'name': 'alex'}, {'name': 'yuan'}, {'name': 'yuan'}, {'name': 'oldboy'}]>