python - Django如何在__gt和__range之间动态选择

标签 python django django-models django-forms django-templates

我的 django 模板中有一个 html 表单,用户可以选择选择对象的价格范围及其实际值(value)价格范围。但他不需要这样做。

<select name="minimum_price">
    <option value="1">1</option>
    <option value="2">2</option>
</select>

<select name="maximum_price">
    <option value="1">1</option>
    <option value="2">2</option>
</select>

<select name="min_real_value">
    <option value="1">1</option>
    <option value="2">2</option>
</select>

<select name="max_real_value">
    <option value="1">1</option>
    <option value="2">2</option>
</select>

我已经阅读了 django 的大部分文档,其中包括以下启发性的文章:Q Class 。然而,鉴于用户可以从这 4 个选择框中选择任何可能的组合,我还没有弄清楚如何为我的模型动态构建查询。

当 Django 的 __range 必须替换为 __gt__lt 时,真正的问题就出现了,而每个“类别”只有一个选择框' 被选中。

这是我到目前为止所做的:

myList = MyObjectsCost.objects.filter(price__range=(minimum_price, maximum_price),
                                   real_value__range=(min_real_value, max_real_value),
                                   **kwargs)

但是,如果缺少 4 个变量之一,则会失败...

提前致谢。

最佳答案

我认为 Daniel Roseman 所说的“聪明”方式是通过字符串构造过滤器?

事情是这样的:

method = MyObjectsCost.objects.filter
qs = method(**{'%s__%s' % (field_name, lookup_type): value})

根据您的情况提供正确的值,您可以构建如下内容:

field_name = 'real_value'
lookup_type = 'gt'
value = 'min_real_value'

它将构造一个传递给过滤器方法的“real_value__gt=min_real_value”字符串。因此您可以根据字符串创建过滤器。这可以派上用场,但也可能最终成为丑陋的黑客代码。因此请谨慎使用,但这个概念可以帮助您构建过滤器。

如果您喜欢第 3 方应用程序,请查看 https://github.com/alex/django-filter这也为您的过滤器提供了更大的灵 active 。

但永远不要忘记保持简单。

关于python - Django如何在__gt和__range之间动态选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23238310/

相关文章:

python - 在 django admin 中有条件地注销或注册模型

python - 表单初始数据不显示在模板中

python - Django 管理员选择与默认模型排序不同的排序

python - 在 Django 中指定一组相关字段时公认的最佳实践是什么?

java - Jython 的 sqlite3 模块

python - 如何以最简单的方式调试 Python C 扩展中的引用计数?

django - 使用 Django 重置 Postgres 数据库的主键

python - 使用请求 python 抓取网页上的 AJAX 内容

python - 如何实现用数据库中的值填充的下拉列表

python - Django 1 模型 - DateTimeField()