-
上节课回顾
-
多对多添加
-
多对多解除
-
基于对象的正向查询和反向查询
-
一对一查询
-
多对多的增删改
-
基于双下划线的跨表查询
-
聚合函数与分组
-
FQ查询
上节课回顾:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
单表操作:
添加
(1)表.objects.create(**kwargs)
(2)obj=表(**kwargs)
obj.save()
一对多的关联字段要建立在多的表中
models.ForeignKey(to='Publish',to_field='id')#与书籍对象关联的出版社对象,因为是一对多关系,所有出版社对象只能有一个
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 模版语法
1)自定义过滤器和标签
2)模版继承:
base.html {% block %} {% block%}
index(继承母板):extend "base.html" {% block %} {% block%}
2 ORM跨表添加
ORM一对多的添加
1、publish_obj=Publish.objects.get(id=2)
表.objects.create(titile='python',publisher=publish_obj)
2、表.objects.create(titile='python',publisher_id=2)
ORM多对多的添加
authors=modes.ManyToManyField('author')#与这本书关联的作者对象集合
绑定关系
obj1=models.Author.objects.get(name="作者1")
obj2=models.Author.objects.get(name="作者2")
book_obj.authors.add(obj1,obj2,...)
book_obj.authors.add(*[列表])
解除关系
book_obj.authors.remove(obj1,obj2,...)
book_obj.authors.remove(*[])
book_obj.authors.clear() 清空与这本书相关的所有作者
3 ORM跨表查询
一对一的跨表查询
正向反向是在于关联字段是在哪个表中,通过关联字段在的那个表查询就是正向查询,反之。
一对多的跨表查询
#查询python这本书出版社的地址(正向查询: 按字段) book_obj=Book.objects.get(title='python') book_obj.publisher.addr #查询指定出版社初版过的所有书籍名称以及价格(反向查询:按关联的表名(小写)_set) pub_obj=models.Publish.objects.get(name="云南出版社") book_list=pub_obj.book_set.all() for obj in book_list: print(obj.title,obj.price)
多对多的跨表查询
# 多对多的正向 查询: 按字段 # 查询 python这本书的所有作者的姓名和年龄 # book_python=models.Book.objects.get(title="python") # author_list=book_python.authors.all() # for obj in author_list: # print(obj.name,obj.age) # # book_pythons = models.Book.objects.filter(title="python") # for book_python in book_pythons: # author_list = book_python.authors.all() # for obj in author_list: # print(obj.name, obj.age) # 多对多的反向查询 按关联的表名(小写)_set # alex出版过的所有书籍的明显名称 # alex=models.Author.objects.get(name="alex") # book_list=alex.book_set.all() # for i in book_list: # print(i.title,i.price)
##################################################################################查询 练习部分start # 正向查询按字段,反向查询按表名_set # query_author=models.Author.objects.filter(name='作者1').first() # query_book=models.Book.objects.get(title='超级仙农')#查询超级仙农的出版社信息 # 查询云南出版社初版的书籍 反向 # yn_pub=models.Publish.objects.filter(name__contains='北京').first() # for i in yn_pub.book_set.all(): # print(i.id,i.title) # 查询指定书籍的所有作者 # bookObj=models.Book.objects.get(title__contains='橡皮擦') # for i in bookObj.authors.all(): # print(i.name) # 查询作者1写的所有书籍 # author1_obj=models.Author.objects.get(name__contains='1') # for i in author1_obj.book_set.all(): # print(i.title) ##################################################################################查询 练习部分end ##################################################################################新增 练习部分start # 参考add部分 # bookObj=models.Book.objects.get(title='阴间商人')#先定位到书籍的obj # l=['2','3']#模拟数据,不能随意,得是作者表中存在的 # bookObj.authors.add(*l)#为书籍绑定多个作者 ##################################################################################新增 练习部分end ##################################################################################删除 练习部分start # bookObj=models.Book.objects.get(title__contains='3') # bookObj.delete() #删除记录 # bookObj=models.Book.objects.get(title__contains='爬虫') # bookObj.authors.remove(models.Author.objects.get(name='作者3')) #解除部分绑定关系 # models.Book.objects.get(title__contains='爬虫').authors.add('3')上面解除完后再测试新增 ##################################################################################删除 练习部分end ##################################################################################双下划线查询 练习部分start # 格式大概为 models.表.objects.filter(条件).values(本表字段或者他表__他表字段) # print(models.Book.objects.filter(title__contains='书').values('price','title')) #获取指定书籍的的price和title字段,<QuerySet [{'price': Decimal('54.00'), 'title': '测试书籍new'}, {'price': Decimal('55.00'), 'title': '测试书籍orz'}]> # print(models.Book.objects.filter(title__contains='python').values_list('publish__name','publish__addr')) # 获取指定书籍的出版社名称和地址< QuerySet[('北京出版社', '北京')] > # print(models.Publish.objects.filter(name__contains='云南').values('book__title','book__price')) #查询指定出版社出版过的书籍信息 #<QuerySet [{'book__title': '超级仙农', 'book__price': Decimal('100.00')}, {'book__title': '渡灵天师', 'book__price': Decimal('101.00')}]> # print(models.Author.objects.filter(name__contains='老九').values('book__title')) # print(models.Author.objects.filter(name__contains='道门老九').values_list('book__title')) #获取指定作者写过的书籍信息<QuerySet [{'book__title': '超级仙农'}, {'book__title': '脑海中的橡皮擦'}, {'book__title': '阴间商人'}, {'book__title': 'python爬虫'}, {'book__title': '测试书籍orz'}]> ##################################################################################双下划线查询 练习部分end