Django F表达式和ArrayField位置

4
我有一个Django的问题,想请教一下:
我的一个模型包含具有可变值的特定指标。因此,我使用Arrayfield来处理这些值。
例如,一个指标有3个值,另一个只有2个值,而某些指标只有1个值。
现在,我想比较Arrayfield中的值。
我知道有那些花哨的F表达式,并尝试使用它们,但是我卡住了,因为似乎F不允许从ArrayField内部进行位置查找。
有人知道我是否可以使用F来进行Arrayfield的位置查找吗?还是我必须从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')

这引发了一个异常..

操作符不存在: double precision = double precision[] LINE 1: ...areable' 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查询显示,似乎F无法处理ArrayField位置...
在Postgres中,满足我的需求的正确查询应该是:
SELECT values FROM indicators WHERE name='compareable' and 
values[1]=values[2];

在我的搜索过程中,我找到了以下链接,但它们并没有帮助到我: Django F字段迭代 https://code.djangoproject.com/ticket/24709


1
看起来Django生成了一个无效的SQL查询。你能把整个查询都发在这里吗? - Mikhail Burshteyn
嗨,Mikhail,我编辑了我的帖子...似乎F不允许使用ArrayFied位置 :-( - derdrave
看了一下Django的这个问题,似乎不支持这种情况 :( - Mikhail Burshteyn
我不确定这个问题是否仍然与我的问题有关,因为它已经一年半了。但看起来是这样的。 - derdrave
谢谢Michail。我将使用SQL原始查询来解决我的问题。 - derdrave
1个回答

2
实际上,在翻译了Postgres查询之后,很明显Django的F表达式仍然没有提供位置查找(可能尚未实现)。
我会将此作为答案留下来,也许可以帮助那些卡在同一点的人。
我决定根据我的具体需求使用Django的SQL-RAW。但通常情况下,我的代码都尽可能使用Django ORM。
这里有一个关于此主题的Django问题,但现在已经是1年半前的事了:https://code.djangoproject.com/ticket/24709 顺便说一下,我的Django版本:Django 2.1(提到的Django问题是v1.8)。
再次感谢Mikhail的建议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接