1. 程式人生 > >Django之查詢知識點總結

Django之查詢知識點總結

 

models.Book.objects.filter(**kwargs).values_list(title) : querySet [(),(),()]

models.Book.objects.filter(**kwargs): querySet [obj1,obj2]

models.Book.objects.filter(**kwargs).values(*args) : querySet [{},{},{}]

 

跨表查詢總結:

1、建立表

class Book(models.Model):
  title = models.CharField(max_length=32)

  publish
=models.ForeignKey("Publish") # 建立一對多的外來鍵欄位   authorList=models.ManyToManyField("Author") # 多對多的關係,自動建立關係表 class Publish(models.Model):   name = models.CharField(max_length=32)   addr = models.CharField(max_length=32) class Author(models.Model):   name=models.CharField(max_length=32)   age=models.IntegerField()   ad
=models.models.OneToOneField("AuthorDetail") #建立一對一的關係 class AuthorDetail(models.Model):   tel=models.IntegerField()

2、基於物件關聯查詢: 

if 一對多查詢(Book--Publish):
  正向查詢,按欄位:
  book_obj.publish : 與這本書關聯的出版社物件 book_obj.publish.addr: 與這本書關聯的出版社的地址
  反向查詢,按表名_set
  publish_obj.book_set: 與這個出版社關聯的書籍物件集合 publish_obj.book_set.all() :[obj1,obj2,....]



if 一對一查詢(Author---AuthorDetail):
  正向查詢,按欄位:
  author_obj.ad : 與這個作者關聯的作者詳細資訊物件

  反向查詢:按表名:
  author_detail_obj.author : 與這個作者詳細物件關聯的作者物件

if 多對多(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"): 如果想查單個值的時候可以這樣查

基於雙下滑線的跨表查詢:

if 一對多查詢(Book--Publish):
  正向查詢,按欄位:

 # 查詢linux這本書的出版社的名字:
  models.Book.objects.all().filter(title="linux").values("publish__name")

  反向查詢:按表名:

# 查詢人民出版社出版過的所有書籍的名字
  models.Publish.objects.filter(name="人民出版社出版").values("book__title")

if 一對一查詢(Author---AuthorDetail):
  正向查詢,按欄位:

#查詢egon的手機號
  models.Author.objects.filter(name="egon").values("ad__tel")

  反向查詢:按表名:

#查詢手機號是151的作者
  models.AuthorDetail.objects.filter(tel="151").values("author__name")

if 多對多(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的值

聚合查詢:
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"))

 

跨表查詢總結:

1、建立表