2016-12-02 57 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

这有帮助。非常感谢! –