一、多表操作(一对多)
添加记录:直接赋值创建表记录;通过对象调用属性查询赋值(django特有操作)
# 添加视图 def addbook(requset): # 方法一 publish_id=2 # Book.objects.create(name=\'linux运维\',price=77,pub_date=\'2017-12-12\',publish_id=2) # 直接给外键赋值 需要知道外键id对应的信息 # 方法二 publish=publish_obj publish_obj=Publish.objects.filter(name=\'人民出版社\')[0] # 取出操作对象 Book.objects.create(name=\'go\', price=66, pub_date=\'2017-5-12\', publish=publish_obj) # 找到人民出版社的id在赋值给publish_id(推荐) return HttpResponse(\'添加成功\')
查询记录:
def select(request): # # 一 524 正向查询 # book_obj=Book.objects.get(name=\'python\') # # 取出名为python的一条记录 # pud_obj=book_obj.publish # # 通过python的外键找到从表的记录对象 # print(pud_obj.name) # # 通过记录对象.取出对象属性 # # 二 524 反向查询 # pub_obj = Publish.objects.filter(name=\'人民出版社\')[0] # # 取出人民出版社对象 # print(pub_obj.book_set.all().values(\'name\',\'price\')) # # 通过人民出版社对象取出所有对应的表筛选名字;没有外键就需要通过(类名_set) # 三 524 下划线查找 ret=Book.objects.filter(publish__name=\'人民出版社\').values(\'name\',\'price\') # 表对象筛选(外键对应的名字是人民出版社)的记录 ;显示两个值 ;正向查找通过外键 print(ret) # 应用:找出python 这本书对应的出版社名字 多找一,也可以用一找多 ret2=Publish.objects.filter(book__name=\'python\').values(\'name\') # 方向查找 从表里面没有外键则通过类名 print(ret2) ret3 = Book.objects.filter(name=\'python\').values(\'publish__name\') # 在__(双下划线)的使用上values也可以使用;找到name=python的实例;筛选出从表对应的name信息 print(ret3) # 应用:查找北京的出版社出过的所有的书 ret4 = Publish.objects.filter(city=\'北京\').values(\'book__name\') print(ret4) return HttpResponse(\'查询成功\')
一对多之反向查找:
总体查找方式有两种
一、正向查找
1.利用主表实例的外键属性
2.下划线
二、反向查找
1.利用从表的实例对象. 主表__set 查找主表对应信息
2.下划线查找
查询使用的函数:
表记录的查询(重点):
filter:
过滤器:按照字段具体的某条记录值去查找 (名字=\'ouyang\'、价格=100)
values:
值:按照某个字段查找 (名字、价格)
book_list = Book.objects.filter(id=2)
book_list=Book.objects.exclude(author="yuan").values("name","price")
book_list=Book.objects.all()
book_list = Book.objects.all()[::2]
book_list = Book.objects.all()[::-1]
#first,last,get取到的是一个实例对象,并非一个QuerySet的集合对象
book_list = Book.objects.first()
book_list = Book.objects.last()
book_list = Book.objects.get(id=2)#只能取出一条记录时才不报错
ret1=Book.objects.filter(author="oldboy").values("name")
ret2=Book.objects.filter(author="yuan").values_list("name","price")
book_list= Book.objects.all().values("name").distinct()
book_count= Book.objects.all().values("name").distinct().count()
模糊查询 双下划线__
book_list=Book.objects.filter(name__icontains="P").values_list("name","price")
book_list=Book.objects.filter(id__gt=5).values_list("name","price")