zoukankan      html  css  js  c++  java
  • Django-ORM查询api

    models.py示例
    class Book(models.Model):
        nid=models.AutoField(primary_key=True)
        title=models.CharField(max_length=32)
        # 书籍与出版社: 一对多
        publisher=models.ForeignKey(to="Publish",related_name="bookList")
        # 书籍与作者: 多对多
        authors=models.ManyToManyField("Author")
    
    class Publish(models.Model):
        name=models.CharField(max_length=32)
       
    class Author(models.Model):
        name=models.CharField(max_length=32)
        
    class AuthorDetail(models.Model):
        addr=models.CharField(max_length=32)
        author=models.OneToOneField("Author")
    单表查收
    models.Book.obejcts.all()       #   QuerySet    []        
           models.Book.obejcts.filter(nid__gt=1,nid__lt=10)  #   QuerySet   []             
           models.Book.obejcts.get()       # model对象   
           models.Book.obejcts.values()     #   QuerySet   [{},{}]            
           models.Book.obejcts.values_list()      
           models.Book.obejcts.exclude()      
           models.Book.obejcts.all().first()   
           models.Book.obejcts.all().last()   
           models.Book.obejcts.all().orderby()   
           models.Book.obejcts.all().reverse() 
           models.Book.obejcts.values("price").distinct()  #去重不要带索引,索引本身是唯一的
           models.Book.obejcts.all().count()
           models.Book.obejcts.all().exist()   
           
           ---- 双下划线:
            models.Book.obejcts.filter(nid__gt=12)    
            models.Book.obejcts.filter(price__in=[112,223,444])    
           
        支持链式操作:   
             models.Book.obejcts.all().filter().orderby("id").count() 
             models.Book.obejcts.all().get().orderby("id").count() 
             
     跨表查询

     基于对象 类似于SQL语句的子查询

    (1) 查询Linux这本书的出版社名称和作者名字   属于正向查询  按关联字段

    book_obj=models.Book.obejcts.get(title="linux")
                 book_obj.publisher.name
                 
                 authors_list=book_obj.authors.all()
                 for author in authors_list:
                     print(author.name) 

    (2) 人民出版社出版过的所有书籍名称   属于反向查询  if 设置related_name,那么related_name的值,没有设置,按表明_set

     publish_obj=models.Publish.obejcts.filter(name="人民出版社").first()
     book_list=publish_obj.bookList.all()
     for book in book_list:
        print(book.title)

    (3) alex 出版社过得所有书籍的名称    属于反向查询 if 设置related_name,那么related_name的值,没有设置,按表明_set

     alex=models.Author.obejcts.get(name="alex")
     book_list=alex.book_set.all()
     for book in book_list:
         print(book.title)

    (4) 作者alex的所在地址  正向查询 按字段  反向查询 按表名

       alex=models.Author.obejcts.get(name="alex")
       alex.authordetail.addr
    基于QuerySet  

    双下划线:类似于inner join   正向查询:按字段     反向查询:按表名    key:  1 过滤条件  2 查询结果

    (1) 查询Linux这本书的出版社名称和作者名字   属于正向查询  按关联字段

    models.Book.obejcts.filter(title="linux").values("publisher__name") # [{"publisher__name":"人民出版社"}]
    models.Book.obejcts.filter(title="linux").values("authors__name")   #

    (2) 人民出版社出版过的所有书籍名称 

     models.Book.obejcts.filter(publisher__name="人民出版社").values("title")
     models.Publish.obejcts.filter(name="人民出版社").values("book__title")        

    (3) alex 出版社过得所有书籍的名称

    models.Book.obejcts.filter(authors__name="alex").values("title")          
    models.Author.obejcts.filter(name="alex").values("book__title")
  • 相关阅读:
    htmlspecialchar()
    LINUX权限bash: ./startup.sh: Permission denied
    str_replace()
    centos安装教程
    给准备做软件测试的新手们的一点个人心得
    TFS安装与管理
    TFS使用指南
    实现对n个数字随机排序,并循环输出100次
    SSM启动Tomcat报错ERROR [localhoststartStop1] Context initialization failed
    同济大学软件学院万院长谈择业
  • 原文地址:https://www.cnblogs.com/xiewenming/p/7922050.html
Copyright © 2011-2022 走看看