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")

 

posted @ 2017-11-30 09:39  warren1236  阅读(687)  评论(0编辑  收藏  举报