2017-03-01 54 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对象时,我会尝试一下。 –