• 上节课回顾

  • 多对多添加

  • 多对多解除

  • 基于对象的正向查询和反向查询

  • 一对一查询

  • 多对多的增删改

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

  • 聚合函数与分组

  • 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
增删改 练习部分

相关文章: