Django 關於related查詢

2021-09-08 16:40:32 字數 2908 閱讀 7819

class

city

(models.model)

: city_name = models.charfield(verbose_name=

'城市名',max_length=20)

def__unicode__

(self)

:return self.city_name

class

author

(models.model)

; name = models.charfield(verbose_name=

'作者'

, max_length=10)

living = models.foreignkey(city)

def__unicode__

(self)

:return self.name

class

book

(models.model)

: author = models.foreignkey(author, related_name=

'author_book'

) title = models.charfield(verbose_name=

'書名'

, max_length=10)

pubtime = models.datefield(verbose_name=

'出版時間'

)def

__unicode__

(self)

:return self.title

related_name屬性

查詢作者下的所有書籍

author = author.objects.

filter

(name=

"金庸"

)book = author.book_set.

all(

)# 子表name+_set()

person.author_books.

all(

)

select_related函式 >> select_related官方文件解釋

查詢某本書籍的一系列資訊

book = book.objects.

filter

(title=

'雪中悍刀行'

)# title,pubtime

author = book.author # name

city = author.living # city_name

books = book.objects.select_related(author_living)

.filter

(title=

'雪中悍刀行'

)

select_related在查詢中,執行的sql語句使用了join的方法,通過一次查詢獲得所有結果

未指定的外來鍵不會新增到查詢結果中

不指定外來鍵會查詢次數會根據外來鍵的數量與deep的增加而增加

所以select_related主要針一對一和多對一關係進行優化。

可以通過可變長引數指定需要select_related的欄位名。也可以通過使用雙下劃線「__」連線欄位名來實現指定的遞迴查詢。沒有指定的字段不會快取,沒有指定的深度不會快取,如果要訪問的話django會再次進行sql查詢。

也可以通過depth引數指定遞迴的深度,django會自動快取指定深度內所有的字段。如果要訪問指定深度外的字段,django會再次進行sql查詢。

也接受無引數的呼叫,django會盡可能深的遞迴查詢所有的字段。但注意有django遞迴的限制和效能的浪費

~django >= 1.7,鏈式呼叫的select_related相當於使用可變長引數。django < 1.7,鏈式呼叫會導致前邊的select_related失效,只保留最後乙個~

prefetch_related函式 >> prefetch_related官方文件解釋

查詢是18年以後發表的書的資訊

books = book.

object

.filter

(pubtime_gt=start_time)

# 查詢符合條件的書籍

for b in books:

book_author = b.author # 查詢書籍物件的author物件

author_city = book_author.city # 查詢author物件的city物件

start_time = datetime.datetime.strptime(

"20180101"

,"%y%m%d"

)books = book.

object

.filter

(pubtime_gt=start_time)

.prefetch_related(

'author_city'

)for b in books:

print b.author # 這裡的author不需要再次查詢資料庫

print b.city

prefetch_related與select_related的目的都是為了減少sql查詢,降低資源消耗。不同的是select_related主要針對於一對多,一對一。而prefetch_related針對於多對多,多對一。

prefetch物件對欄位指定的方式和prefetch_related中的引數相同,都是通過雙下劃線連線的欄位名完成的。

~可以通過 queryset 引數手動指定prefetch使用的queryset。~

~可以通過 to_attr 引數指定prefetch到的屬性名。~

生物資訊 related

生物資訊學的研究重點主要體現在基因組學 genomics 和蛋白質組學 proteomics 兩個方面,intron 內含子,exon外顯子 雙螺旋結構是基於對鹼基配對規律的認識 氫鍵結合只發生於互補的鹼基a與t g與c之間。雙螺旋分子兩條鏈的嚴格互補性,是指一條鏈的核苷酸順序,無例外地取決於另一條...

關於Django的contenttypes資料遷移

在使用django開發過程中遇到乙個問題,在使用了contenttype genericforeignkey genericrelation等模組時,如果要使用dumpdata遷移資料,你可能會發現,資料庫中django content type這張表中模組的id會變化,導致資料亂掉!後來發現,這個...

django 關於靜態檔案

在開發中通常會使用到css,js,img等靜態檔案,關於django如何處理以及配置還是比較糾結,其實官網中有給出詳細說明,只是剛入門者容易混,這裡記錄下配置流程。在settings.py中配置靜態檔案位置,直接給出配置 static url static static root os.path.j...