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 对象,该对象将按 datecategorysomething 进行过滤,但前提是它存在于我应用过滤器的模型中。

换句话说,我可以在AB 模型上应用一个Q,就像B 一样,something 过滤器将被忽略,因为该字段在@ 中不存在987654331@.

如果我尝试一个简单的实现,例如一个带有datecategorysomethingQ,当应用于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 对象的主要内容,如果未能解决你的问题,请参考以下文章

Mysql如果某个字段值存在则更新另一个字段的值为原值+100,命令应该如何写?

Django的form(和model)验证器

通过一个表单字段在 Django 中上传多个文件

Mongodb如何仅在不存在时插入(如果存在则不更新)?

如果存在则增加行上的字段,否则插入新行

Django 多文件字段