我的 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/