【发布时间】:2018-09-30 07:00:17
【问题描述】:
我对 Django 有疑问,想请教一些建议:
我的一个模型包含具有可变值的特定指标。这就是我使用 Arrayfield 的原因。
例如,一个指标有 3 个值,另一个只有 2 个值,有些只有 1 个值。
现在我想比较 Arrayfield 中的值。
所以我知道有那些花哨的 F 表达式,我尝试使用它们,但在这里我被卡住了,因为 F 似乎不允许从 ArrayField 内部进行位置查找。
有谁知道我是否可以使用 F 进行数组字段的位置查找?还是我必须从 Django 直接进行 SQL 调用或以某种方式更改我的数据库以使每个字段产生一个值?
这是模型:
class Indicators(models.Model):
datetime = models.DateTimeField(default=datetime.now)
name = models.TextField(default="none")
values = ArrayField(models.FloatField(default=0))
这就是我想要实现的目标:
indicator_compareable = Indicators.objects.filter(name='compareable',
values__0=F('values__1')).values_list('values')
它引发了一个异常..
运算符不存在:双精度 = 双精度[] 第 1 行:...可访问的' AND "indicators"."values"[1] = ("...
正如 Mikhail 所建议的(在我的帖子的第一条评论中),这是我的 Django 过滤器中翻译后的 SQL:
SELECT "indicators"."values"[1] FROM "indicators"
WHERE ("indicators"."name" = 'compareable'
AND "indicators"."values"[1] = ("indicators"."values"))
从异常看来,我不允许将 ArrayField 位置赋予 F 表达式(或者 Django 忽略该位置..)。翻译后的 sql-query 显示,似乎 F 不处理 ArrayField-position...
在 postgres 中,我需要的正确查询是:
SELECT values FROM indicators WHERE name='compareable' and
values[1]=values[2];
在搜索过程中,我在这里找到了这些链接,但它们没有帮助..: Django F field iteration https://code.djangoproject.com/ticket/24709
【问题讨论】:
-
看起来 Django 生成了一个无效的 SQL 查询。你能在这里发布整个查询吗?
-
嗨 Mikhail,我编辑了我的帖子.. 似乎 F 不允许使用 ArrayFied 位置:-(
-
看this Django issue,好像不支持这种情况:(
-
我不确定这个问题是否仍然与我的问题有关,因为它已经存在一年半了。不过好像。
-
谢谢迈克尔。我将使用 sql-raw 查询来解决我的问题