django - 如果一个或多个字段不存在则不断言的 Q 对象
Posted
技术标签:
【中文标题】django - 如果一个或多个字段不存在则不断言的 Q 对象【英文标题】:django - Q object that don't assert if one or more fields don't exist 【发布时间】:2017-07-20 20:34:57 【问题描述】:假设我有以下模型:
Model A:
date
category
something
...
和:
Model B:
date
category
...
我想创建一个单独的 Q 对象,该对象将按 date
、category
和 something
进行过滤,但前提是它存在于我应用过滤器的模型中。
换句话说,我可以在A
和B
模型上应用一个Q
,就像B
一样,something
过滤器将被忽略,因为该字段在@ 中不存在987654331@.
如果我尝试一个简单的实现,例如一个带有date
、category
和something
的Q
,当应用于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)
【讨论】:
这是一个非常有趣的解决方案!我最终做的是一个查询字典,其中模型类型是键,值略有不同 Q,但我喜欢你建议的方法。下次为这些模型编写 Q 对象时,我会尝试一下。以上是关于django - 如果一个或多个字段不存在则不断言的 Q 对象的主要内容,如果未能解决你的问题,请参考以下文章