2016-12-02 59 views
0

比方說,我在models.py以下型號配置:Django的關聯模型中選擇一個行集

class ModelA(models.Model): 
    columnA = models.ForeignKey(ModelZ) 
    created = models.DateTimeField(auto_now_add=True) 

class ModelB(models.Model): 
    columnB = models.ForeignKey(ModelA, related_name='modelsets') 
    is_open = models.BooleanField() 
    created = models.DateTimeField(auto_now_add=True) 

我知道我可以選擇所有的MODELA對象,並使用所有相關的ModelB對象prefetch_related操作。但在我的使用案例中,我想從ModelA中選擇所有對象,並只從ModelB對象中選擇滿足特定條件的一個(或某些)相關行。

例如:

ModelA.objects.prefetch_related( 'modelB_set')其中modelB__is_open =真 類似的東西。

的預期結果是:

[{ 
    columnA : 1 
    created : 'time' 
    modelsets :[{ 
     columnB : 1 
     is_open = True 
     created = 'time' 
    },{ 
     columnB : 2 
     is_open = True 
     created = 'time' 
    } 

},{ 
    columnA : 2 
    created : 'time' 
    modelsets :[{ 
     columnB : 3 
     is_open = True 
     created = 'time' 
    }  
}] 

我累了谷歌搜索關於這個的,爲了更好地理解Django的ORM查詢的任何鏈接會更明顯。謝謝!

回答

1

嘗試使用Prefetch()對象

queryset_b = Model_B.objects.filter(is_open=True) 
result=Model_A.objects.prefetch_related(Prefetch('modelsets', queryset=queryset_b)) 
+0

我試圖用這個。但它表示_不能在ModelA對象上找到'modelB_set','modelB_set'對prefetch_related()_來說是一個無效參數。我是否應該在Models.py中做一些事情來反映這一點? –

+0

@nithinks哦,你正在使用related_name,然後試試這個:'Prefetch('modelsets',queryset = queryset_b)' – neverwalkaloner

+0

這有幫助。非常感謝! –