2017-03-01 89 views
0

一個或多個字段不主張可以說我有以下型號:Django的 - Q對象,如果不存在

Model A: 
    date 
    category 
    something 
    ... 

和:

Model B: 
    date 
    category 
    ... 

我想創建一個單個Q對象,將按date,categorysomething進行過濾,但前提是隻有在我應用過濾器的模型中存在。

換句話說,一個Q,我可以申請兩個AB模式,只是與B因爲這個領域不B存在something過濾器將被忽略。

如果我嘗試了天真的實現,例如Qdatecategory和它something,當B模型應用於我收到以下錯誤:

FieldError: Cannot resolve keyword 'something' into field. Choices are...

這是合理的由於B真不其中沒有一個名爲something的字段。但我想改變這種行爲並使其工作,並忽略不存在的字段而不是拋出異常。

這可能嗎?

回答

1

不。但是,您可以編寫一個函數來檢查模型的字段,並生成適當的Q對象。例如:

def content_query(model, value): 
    allowed = ['date', 'category', 'something'] 
    model_fields = [f.name for f in model._meta.fields and f.name in allowed] 

    return Q(**{f: value for f in model_fields}) 
+0

這是一個非常有趣的解決方案!我最終做的是一個查詢字典,其中模型類型是關鍵,值略有不同,但我喜歡你所建議的方法。下次我爲這些模型編寫Q對象時,我會嘗試一下。 –