zoukankan      html  css  js  c++  java
  • Python学习第135天(Django的ORM多对多查询)

    今天总结一下,感觉近期的知识点比较多,但是很多测试是为了测试而测试,不具备实际的使用价值,所以打算开始加快学习进度,粗略听,简单总结,在案例实践的时候进行重点了解,今天主要看的是ORM的多对多查询。

      大致有两种方式,一种是使用系统提供的多对多表格,另一种属于自己设定一个表格。自定表格增加比较方便,但查询逻辑不佳,而系统表格查询方便,但是增加内容比较麻烦。

      多表操作(多对多): 

      创建多对多的关系 author= models.ManyToManyField("Author")(推荐)


      书籍对象它的所有关联作者 obj=book_obj.authors.all()
      绑定多对多的关系 obj.add(*QuerySet)
        obj.remove(author_obj)


      如果想向第三张表插入值的方式绑定关系: 手动创建第三张表

        # class Book_Author(models.Model):
        # book=models.ForeignKey("Book")
        # author=models.ForeignKey("Author")
        Book_Author.objects.create(book_id=2,author_id=3)

    实际操作:models

    class Book(models.Model):
        name=models.CharField(max_length=20)
        price=models.IntegerField()
        pub_date=models.DateField()
        publish=models.ForeignKey("Publish")
        authors=models.ManyToManyField("Author")
    
        def __str__(self):
            return self.name
    
    class Publish(models.Model):
    
        name=models.CharField(max_length=32)
        city=models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    
    
    # class Book_Author(models.Model):
    #     book=models.ForeignKey("Book")
    #     author=models.ForeignKey("Author")
    
    
    class Author(models.Model):
    
        name=models.CharField(max_length=32)
        age=models.IntegerField(default=20)
    
        def __str__(self):
            return self.name

    views:(都暂时写在add下面,完全没有教使用方式,只是单纯输出,暂时比较无脑)

    #通过对象的方式绑定关系
    
    
        # book_obj=Book.objects.get(id=3)
        # print(book_obj.authors.all())
        # print(type(book_obj.authors.all()))
        #
        # author_obj=Author.objects.get(id=2)
        # print(author_obj.book_set.all())
    
    
        # book_obj=Book.objects.get(id=3)
        # author_objs=Author.objects.all()
        # #book_obj.authors.add(*author_objs)
        # # book_obj.authors.remove(*author_objs)
        # book_obj.authors.remove(4)
    
    
    
        #创建第三张表
        # Book_Author.objects.create(book_id=2,author_id=2)
        #
        # obj=Book.objects.get(id=2)
        # print(obj.book_author_set.all()[0].author)
    
        #alex出过的书籍名称及价格
    
        # ret=Book.objects.filter(book_author__author__name="alex").values("name","price")
        # print(ret)
    
        # ret2=Book.objects.filter(authors__name="alex").values("name","price","authors__name")
        # print(ret2)
    
        # ret=Book.objects.all().aggregate(Avg("price"))
        # ret=Book.objects.all().aggregate(Sum("price"))
        # ret=Book.objects.filter(authors__name="alex").aggregate(alex_money=Sum("price"))
        # ret=Book.objects.filter(authors__name="alex").aggregate(Count("price"))
        # print(ret)

    以上内容就是今天的全部内容。

  • 相关阅读:
    POJ 2376 Cleaning Shifts 贪心
    POJ 2376 Cleaning Shifts 贪心
    魔咒词典 HDU
    2019第十届蓝桥杯C/C++ A组省赛 —— 第三题: 最大降雨量
    2019第十届蓝桥杯C/C++ A组省赛 —— 第二题: 数列求值
    2019第十届蓝桥杯C/C++ A组省赛 —— 第二题: 数列求值
    2019第十届蓝桥杯C/C++ A组省赛 —— 第一题:平方和
    2019第十届蓝桥杯C/C++ A组省赛 —— 第一题:平方和
    2015年第六届蓝桥杯C/C++ A组国赛 —— 第五题:切开字符串
    2015年第六届蓝桥杯C/C++ A组国赛 —— 第五题:切开字符串
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13340826.html
Copyright © 2011-2022 走看看