【问题标题】:Django dynamic filter based on variable (str) [duplicate]基于变量(str)的Django动态过滤器[重复]
【发布时间】:2018-09-19 22:57:59
【问题描述】:

我正在编写一个函数,它可以基于动态插入的模型返回表项。所以我需要避免在函数中使用模型名称。现在我有时会与另一个模型建立多对多的关系,并想在那个模型上进行选择。

假设我的 Files 模型中有一个 projects = ManyToMany(Projects) 字段。现在我可以使用了:

filter(projects__in=[1])

选择与 id 为 1 的项目相关的文件,但我需要此过滤器的项目部分是动态的,因此我可以使用类似:

a_field = 'projects'
filter(a_field+'__in'=[1])

这显然行不通。我该怎么做?

【问题讨论】:

  • 我可以看到与'duplicate'的相似之处,但是作为初学者,并且涉及到多对多的关系,我认为它还是有用的。
  • 顺便说一句,答案正是我想要的!
  • 没有任何批评 :) 欺骗的链接内容可能对其他用户有价值。

标签: python django filter


【解决方案1】:

您可以通过在 Python 中使用 **kwargs 来做到这一点:您构建一个将字符串(参数的名称)映射到值的字典,然后使用带有两个星号的字典调用该函数,例如:

a_field = 'projects'
params = {a_field+'__in': [1]}
filter(**params)

我们当然需要在单独的行上构造字典:

a_field = 'projects'
filter(**{a_field+'__in': [1]})

如果你因此有一个像{'foo': 'bar', 'qux': 14} 这样的字典,那么用foo(**{'foo': 'bar', 'qux': 14}) 调用它就相当于foo(foo='bar', qux=14)。这种技术并非特定于 Django,而是特定于 Python。 Python 也有一种方法可以使用 positional 参数:foo(*[1, 'a', 4]) 等价于 foo(1, 'a', 4)

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    相关资源
    最近更新 更多