django - Q对象,如果一个或多个字段不存在则不断言

时间:2017-03-01 13:26:53

标签: django django-models django-filter django-q

假设我有以下型号:

Model A:
    date
    category
    something
    ...

Model B:
    date
    category
    ...

我想创建一个Q对象,它将按datecategorysomething进行过滤,但只有在模型中存在我才会应用过滤器。

换句话说,我可以在QA模型上应用的BBsomething B过滤器被忽略,因为此字段不存在于Q

如果我尝试一个简单的实现,例如date categorysomethingB,当应用于FieldError: Cannot resolve keyword 'something' into field. Choices are...模型时,我会得到以下错误:

something

这是有道理的,因为B真的没有一个名为@Controller的字段。但我希望改变这种行为并使其工作,只是忽略不存在的字段而不是抛出异常。

这可能吗?

1 个答案:

答案 0 :(得分:2)

没有。但是,您可以编写一个检查模型字段的函数,并生成相应的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})