簡體   English   中英

結合使用Django select_related和其他過濾器

[英]Using django select_related with an additional filter

我試圖找到一種執行查詢的最佳方法,但是讓自己對prefetch_related和select_related用例感到困惑。

我有一個3表外鍵關系:A->有1個很多B h->作為1個很多C。

class A(models.model):
   ...

class B(models.model):
   a = models.ForeignKey(A)

class C(models.model):
   b = models.ForeignKey(B)
   data = models.TextField(max_length=50)

我試圖獲取匹配條件的A的所有實例(A的實例及其所有子代)的所有C.data的列表,所以我有類似以下內容:

qs1 = A.objects.all().filter(Q(id=12345)|Q(parent_id=12345))
qs2 = C.objects.select_related('B__A').filter(B__A__in=qs1)

但是我對( Prefetch文檔中指出的那點很警惕:

任何隨后的暗示不同數據庫查詢的鏈接方法都將忽略先前緩存的結果,並使用新的數據庫查詢來檢索數據

我不知道這在這里是否適用(因為我使用的是select_related),但是閱讀它似乎使我在執行過濾器后就失去了通過select_related獲得的任何東西。

我的兩部分查詢是否達到最佳狀態? 據我所知,我認為我不需要預取,盡管我注意到我可以將select_related與prefetch_related換出並獲得相同的結果。

我認為您的問題是由誤解引起的。 select_related (和prefetch_related )是一種優化 ,專門用於返回相關模型中的值以及原始查詢。 永遠不需要它們。

而且,它們對filter都沒有任何影響。 不論您是否使用select_related ,Django都會自動執行相關的聯接和子查詢以進行查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM