2014-06-11 82 views
1

我有一個模型ModelA。基於字段/列值的django過濾器

class ModelA: 
    m2m_1_field = models.BooleanField() 
    #lots of other fields 

它有2 m2m關係m2m_1和m2m_2都返回相同類型。
如果ModelA的字段m2m_1_field爲True,那麼我們需要從m2m_1中獲取m2m結果(如instance.m2m_1.all())。
如果ModelA的字段m2m_1_field爲False,那麼我們需要從m2m_2獲取m2m結果(如instance.m2m_2.all())。

所以,當搜索這個模型時,我也必須搜索這些m2m關係。

比方說,我們需要尋找M2M對象與IDS 1和2。然後,我們應該做的:

if m2m_1_field is True: 
    for id in [1,2]: 
     queryset = queryset.filter(m2m_1__id=id) 
if m2m_1_field is False: 
    for id in [1,2]: 
     queryset = queryset.filter(m2m_2__id=id) 

以上只是theoritical的解釋,我們如何能做到這一點幾乎?

或者乾脆忘掉m2m,只是假設有兩個字段f1,f2(兩個字段)。如果m2m_1_field爲True,則需要搜索f1字段,如果m2m_1_field爲False,則需要搜索f2字段。怎麼樣 ?

只是一個猜測:

filter(Q(m2m_1_field=True, f1=val) | Q(m2m_1_field=False, f2=val))) Is this right? 

請讓我知道了進一步澄清。

+0

創建模型管理器,根據字段布爾值進行相應的過濾。 – petkostas

+0

我沒有得到你。請舉例。 – user2349115

+1

https://docs.djangoproject.com/en/1.6/topics/db/managers/ – petkostas

回答

0

你和你最後一個例子非常接近。我認爲你想要的是以下內容:

我要定義我假設你的模型是什麼。

class M2MModel: 
    pass 

class ModelA: 
    m2m_1_field = models.BooleanField() 
    m2m_1 = models.ManyToManyField(M2MModel, related_name="m2m_1_set", null=True, blank=True) 
    m2m_2 = models.ManyToManyField(M2MModel, related_name="m2m_2_set", null=True, blank=True) 

爲了返回正確的一組M2MModels的時候,你會希望在M2MModel而非ModelA執行查詢。

model_a_id = SOME_ID_VALUE 
results = M2MModel.objects.filter(
    Q(m2m_1_set__id=model_a_id, m2m_1_set__m2m_1_field=True) 
    | Q(m2m_2_set__id=model_a_id, m2m_2_set__m2m_1_field=False) 
).distinct()