- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
[编辑]
我创建了一个示例 Django Repl.it Playground ,预加载了这个确切的案例:
https://repl.it/@mormoran/Django-Building-dynamic-Q-queries-for-related-tables
[/编辑]
我正在尝试根据相关对象过滤表上的对象,但遇到问题。
我有一个表运行
:
class Run(models.Model):
start_time = models.DateTimeField(db_index=True)
end_time = models.DateTimeField()
每个Run
对象都有相关表RunValue
:
class RunValue(models.Model):
run = models.ForeignKey(Run, on_delete=models.CASCADE)
run_parameter = models.CharField(max_length=50)
value = models.FloatField(default=0)
在RunValue
中,我们存储运行的详细特征,称为run_parameter
。电压、温度、压力等。
为了简单起见,我们假设我要过滤的字段是“最低温度”和“最高温度”。
例如:
Run 1:
Run Values:
run_parameter: "Min. Temperature", value: 430
run_parameter: "Max. Temperature", value: 436
Run 2:
Run Values:
run_parameter: "Min. Temperature", value: 627
run_parameter: "Max. Temperature", value: 671
Run 3:
Run Values:
run_parameter: "Min. Temperature", value: 642
run_parameter: "Max. Temperature", value: 694
Run 4:
Run Values:
run_parameter: "Min. Temperature", value: 412
run_parameter: "Max. Temperature", value: 534
(RunValue.value 是 float ,但为了简单起见,我们将其保留为整数)。
我的页面中有两个 HTML 输入,用户可以在其中输入最小值和最大值(温度)。它们可以都留空,或者只留空一个,或者两者都留空,因此它是一个开放式过滤器,它可以定义要过滤或不过滤的范围。例如,如果用户要输入:
Min. temperature = 400
Max. temperature = 500
该组过滤器应仅返回上述 Run
实例示例中的运行 1,其中阈值下限高于 400,阈值上限低于 500。所有其他运行
不符合条件。
那么我需要返回所有 Run
对象实例,其中 RunValue
与用户输入的过滤器匹配。
这是我尝试过的:
# Grabbing temp ranges from request and setting default filter mins and maxs:
temp_ranges = [0, 999999] # Defaults in case the user does not set anything
if min_temp_filter:
temp_ranges = [min_temp_filter, 999999]
if max_temp_filter:
temp_ranges = [0, max_temp_filter]
if min_temp_filter and max_temp_filter:
temp_ranges = [min_temp_filter, max_temp_filter]
# Starting Q queries
temp_q_queries = [
Q(runvalue__run_parameter__icontains='Min. Temperature'),
Q(runvalue__run_parameter__icontains='Max. Temperature')
]
queryset = models.Q(reduce(operator.or_, temp_q_queries), runvalue__value__range=temp_ranges)
filtered_run_instances = Run.objects.filter(queryset)
运行会产生一些结果,但不是期望的结果。它返回 Run 1 和 Run 4,而它应该只返回 Run 1。
temp_ranges
为 400 到 500,Run 1 合格,但 Run 4 的最高温度超过 500,它不合格。过滤器需要通过同时查看两个范围(最小值和最大值)来排除对象实例。
打印的查询如下:
(AND: (OR: ('runvalue__run_parameter__icontains', 'Min. Temperaure'), ('runvalue__run_parameter__icontains', 'Max. Temperature')), ('runvalue__value__range', ['400', '500']))
我认为我需要用伪代码过滤:
所有具有 RunValue 实例的运行,其中 RunValue.run_parameter 为“最低温度”或“最高温度”且 RunValue.value 介于 400 和 500 之间
。
然后我认为我应该将 Q 查询中的值范围作为常规 Django 过滤器包含在内,并用逗号分隔:
temp_q_queries = [
Q(runvalue__run_parameter__icontains='Min. Temperature', runvalue__value__range=temp_ranges),
Q(runvalue__run_parameter__icontains='Max. Temperature', runvalue__value__range=temp_ranges)
]
queryset = models.Q(reduce(operator.or_, temp_q_queries))
filtered_run_instances = Run.objects.filter(queryset)
相同的结果,因此值范围不是问题,而是逻辑分组(我认为?)。
所以我尝试做两次reduce Q查询(看起来有点粗糙),也就是说:
具有名称为“最低温度”且值高于 400 的 RunValue 实例的所有运行,以及具有名称为“最高温度”且值低于 400 的 RunValue 实例的所有运行超过 500
temp_q_queries = [
models.Q(reduce(operator.and_, [Q(runvalue__run_parameter__icontains='Min. Temperature'), Q(runvalue__value__gte=temp_ranges[0])]),
models.Q(reduce(operator.and_, [Q(runvalue__run_parameter__icontains='Max. Temperature'), Q(runvalue__value__lte=temp_ranges[1])]))
]
queryset = models.Q(reduce(operator.and_, temp_q_queries))
filtered_run_instances = Run.objects.filter(queryset)
(注意所有 3 个 reduce
均更改为 AND 门)
这产生了 0 次点击。
对 temp_q_queries
使用相同的复合归约方法,但将 queryset
的外部逻辑门更改为 OR 会产生相同的错误结果,运行 1 和运行 4:
queryset = models.Q(reduce(operator.or_, temp_q_queries))
filtered_run_instances = Run.objects.filter(queryset)
也许我在这里把自己复杂化了,有一些非常简单的东西我没有看到(我已经尝试解决这个逻辑难题两天了,有点狭隘的视野。但我宁愿希望它是可解决,而且简单。
如有任何帮助或问题,我们将不胜感激。
最佳答案
您的问题是您需要满足这两个条件,并且它们在 RunValue 相关表的同一行上永远不会有效。您想要选择在该范围内具有“最低温度”行以及类似的“最高温度”有效行的根对象。您必须使用子查询。
最好是使用Django 3.0 Exists() subquery condition 。它可以轻松地为旧的 Django 进行定制。
具体示例:
from django.db.models import Exists, OuterRef
queryset = Run.objects.filter(
Exists(RunValue.objects.filter(
run=OuterRef('pk'),
run_parameter='Min. temperature',
value__gte=400)),
Exists(RunValue.objects.filter(
run=OuterRef('pk'),
run_parameter='Max. temperature',
value__lte=500)),
)
与通用解决方案相同,因为您需要一个动态过滤器:
filter_data = {
'Min. temperature': 400,
'Max. temperature': 500,
}
param_operators = {
'Min. Temperature': 'gte',
'Max. Temperature': 'lte',
# much more supported parameters... e.g. 'some boolean as 0 or 1': 'eq'.
}
conditions = []
for key, value in filter_data.items():
if value is not None:
conditions.append(Exists(RunValue.objects.filter(
run=OuterRef('pk'),
run_parameter=key,
**{'value__{}'.format(param_operators[key]): value}
)))
queryset = Run.objects.filter(*conditions)
您知道“最低温度”<=“最高温度”,但数据库优化器不知道。我通过删除范围的多余条件来优化它。最好完全删除无用的条件“最高温度”<= 999999。
此答案可以轻松定制为 Django >=1.11 <= 2.2 Exists() condition在您阅读该文档的大约数十行之后。
在这种简单的情况下,您不需要 Q()
对象,即使您想通过简短的单行表达式重写它并添加助记符临时变量。
编辑具体示例可以这样为 Django <3.0 重写
queryset = Run.objects.annotate(
min_temperature_filter=Exists(RunValue.objects.filter(
run=OuterRef('pk'),
run_parameter='Min. temperature',
value__gte=400)),
max_temperature_filter=Exists(RunValue.objects.filter(
run=OuterRef('pk'),
run_parameter='Max. temperature',
value__lte=500)),
).filter(
min_temperature_filter=True,
max_temperature_filter=True,
)
关于python - Django:为相关表构建动态 Q 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581548/
在 JavaScript 中,我们可以动态创建 元素并附加到 部分,以便为大量元素应用 CSS 规则。 这种方法的优点或缺点是什么? 如果它确实提供了与元素上的 javascript 迭代相比的性
我有这个代码 import "./HTTPMethod.dart"; import '../../DataModel/DataModel.dart'; mixin RouterMixin { HT
哪些 OLAP 工具支持动态、动态地创建维度或层次结构? 例如,层次结构将成员定义为:“前 5 名”、“前 6-10 名”、“其他”... 计算成员是通常的答案,我正在寻找不同的东西。计算器的问题。成
我正在 CakePHP 中创建一个“表单编辑器”。 该界面允许用户选择要应用于字段的验证,例如数字、电子邮件等 因此,我需要根据用户输入为模型动态创建验证。为此,我可以使用验证对象:https://b
这是一个场景: 我有一个Web服务,我们将其称为部署在tomcat(轴)上的StockQuoteService。通过此 Web 服务公开了 getStockQuote() 方法。 现在,我想构建一个
我正在尝试从服务器获取 JSON 响应并将其输出到控制台。 Future login() async { var response = await http.get( Uri.
我从另一个问题中得到了这段代码(感谢 chunhunghan)。我需要创建一个登录屏幕,并尝试根据服务器发回给我的响应来验证用户凭据,但是每次我尝试运行代码时,它都会给我“未处理的异常:Interna
当我在“Dart”主程序中运行它时,一切正常,并且我得到了一个与会者列表。但是,当我在我的 Flutter 应用程序中调用它时,出现错误: flutter:“List”类型不是“List>”类型的子类
本文实例为大家分享了js实现验证码动态干扰的具体代码,供大家参考,具体内容如下 效果一 效果二 代码一 ?
目前我正在为我的网站使用 No-Ip,我想使用 cloudflare 来抵御 ddos 和机器人程序。我注意到您需要一个用于 cloudflare 的域。我还搜索了网络,发现了一个叫做 cloud
有没有办法在 Excel VBA 中构建动态 if 语句?基本上我正在尝试创建一个参数化计算,用户将能够输入不同的变量,即 变量 1 “变量 2” “变量 3” 在这种情况下 变量 1 是单元格引用
大家好, 请查看上面的图片,我有两张 table 。在下面代码的第一个表中,我得到了这种格式。 但我想像 Table2 那样格式化,每个合并单元格中的行数是动态的,而且不一样。 有没有办法像table
如何根据我添加的 View 修改标题部分的高度?heightForHeaderInSection在 viewForHeaderInSection 之前被调用我不知道 View 大小,直到我创建它。 最
是否存在在运行时生成 AST/解析树的解析器?有点像一个库,它会接受一串 EBNF 语法或类似的东西并吐出数据结构? 我知道 antlr、jlex 和他们的同类。他们生成可以做到这一点的源代码。 (喜
我在持有汽车制造商的表格上有一个 MultipleChoiceField。我想将我的汽车数据库过滤到已检查的品牌,但这会导致问题。如何动态获取所有 Q(make=...) 语句? 我如何开始:['va
$end = preg_replace($pattern, $replacement, $str); 如何使替换字符串 $replacement 随 $str 中的每次匹配而变化?例如,我想用关联的图
我正在编写一个 VBA 程序,用于过滤表中的值。我试图使其成为一个适用于您提供的所有表格的通用程序。在我的程序中,我必须设置它正在过滤的表的范围:Set rng = dataSheet.Range("
我正在循环一个元素数组,并且我想使用给定的模板递归地显示该元素 然后在该模板内使用带有切换功能的按钮来显示/隐藏给定元素的Child的更深级别模板(Child也是一个元素) 这是我的模板
从客户端(html)发送表单,服务器端通过选择选项之一决定运行哪个函数。 const decideWho = (form) => { const choice = form.choice; c
我有一个具有以下属性的按钮: circle_normal.xml(在 res/drawable 中) circle.xml(在 res/drawable 中)
我是一名优秀的程序员,十分优秀!