• django----对model查询扩展


    基于对象关联查询

    一对多查询(Book--Publish):

    正向查询,按字段:     (从关联的表中查询)
      book_obj.publish : 与这本书关联的出版社对象 book_obj.publish.addr: 与这本书关联的出版社的地址
    反向查询,按表名_set  (从被关联的表中查)
      publish_obj.book_set: 与这个出版社关联的书籍对象集合	publish_obj.book_set.all() :[obj1,obj2,....] 
    

    一对一查询(Author---AuthorDetail):

    正向查询,按字段:
      author_obj.ad : 与这个作者关联的作者详细信息对象
    反向查询:按表名:
      author_detail_obj.author : 与这个作者详细对象关联的作者对象
    

    多对多(Book----Author)

    正向查询,按字段: 
      book_obj.authorList.all(): 与这本书关联的所有这作者对象的集合 [obj1,obj2,....]
      book_obj.authorList.all().values("name"): 如果想查单个值的时候可以这样查
    反向查询,按表名_set:
      author_obj.book_set.all() : 与这个作者关联的所有书籍对象的集合
       book_obj.book_set.all().values("name"): 如果想查单个值的时候可以这样查
    

     

    基于双下滑线的跨表查询:

    一对多查询(Book--Publish)

    正向查询:按字段
    #查询linux这本书的出版社的名字: models.Book.objects.all().filter(title="linux").values("publish__name")

    反向查询:按表名:
    # 查询人民出版社出版过的所有书籍的名字
    models.Publish.objects.filter(name="人民出版社出版").values("book__title")

    一对多查询(Book--Publish)

    正向查询,按字段:
    #查询egon的手机号
    models.Author.objects.filter(name="egon").values("ad__tel")
    
    反向查询:按表名:
    #查询手机号是151的作者
    models.AuthorDetail.objects.filter(tel="151").values("author__name")
    

    多对多(Book----Author):

    正向查询,按字段:
    #查询python这本书的作者的名字
    models.Book.objects.filter(title="python").values("authorList__name") 

    反向查询,按表名:
    #查询alex出版过的出的价格
    models.Author.objects.filter(name="alex").values("book__price")

      

    补充:

    publish=models.ForeignKey("Publish",related_name="bookList")
    authorlist=models.ManyToManyField("Author",related_name="bookList") 
    ad=models.models.OneToOneField("AuthorDetail",related_name="authorInfo")
    反向查询的时候都用:related_name的值,不用_set

    聚合查询

    querySet().aggregate(聚合函数)------返回的是一个字典,不再是一个querySet
    Book.objects.all().aggregate(average_price=Avg('price'))
    

    分组查询:

    querySet().annotate() --- 返回的是querySet
    #统计每一个出版社中最便宜的书籍的价格
    sql:   select Min(price) from book group by publish_id;
    ORM:  models.Book.objects.values("publish__name").annotate(Min("price"))

    only和defer

    datalist = models.Userinfo.objects.all().only("name","email")  #拿到的还是一个QuerySet集合,仅仅取name和email
    for item in datalist:
        print(item.id)
        print(item.name)
        print(item.pwd)   #只要表里有这个字段,一样会取到值,额外的会再发一次请求
    
    datalist = models.Userinfo.objects.all().defer("name","email") #阻止,不取name和email
    for item in datalist:
        print(item.id)
        print(item.pwd)
    

    注意:用only的话就去取only里面的字段,取其他的字段效率太低了,尽可能的少的连接数据库

  • 相关阅读:
    @loj
    @codeforces
    @bzoj
    @hdu
    @poj
    @loj
    @bzoj
    @bzoj
    Python配合BeautifulSoup读取网络图片并保存在本地
    Java--多线程读取网络图片并保存在本地
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/10585881.html
Copyright © 2020-2023  润新知