Django F表达式和ArrayField位置

时间:2018-09-30 07:00:17

标签: python django

我对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')

它会引发异常。

  

运算符不存在:双精度=双精度[]   第1行:... areable'和“ indicators”。“ values” [1] =(“ ...

正如Mikhail所建议的(在我的帖子的第一条评论中),这是我的Django过滤器翻译后的SQL:

SELECT "indicators"."values"[1] FROM "indicators" 
 WHERE ("indicators"."name" = 'compareable' 
  AND "indicators"."values"[1] = ("indicators"."values"))

从异常看来,似乎不允许我将ArrayField的位置提供给F Expression(或者Django忽略了该位置。)。并且翻译后的sql查询显示,似乎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

1 个答案:

答案 0 :(得分:0)

因此,实际上,在投资翻译后的postgres查询之后,很明显django的F表达式(仍然)没有提供位置查找(并且可能没有实现)。

我将保留这个答案,也许它可以帮助那些卡在同一地点的人。

我决定根据我的特定需求使用Django的SQL-RAW。但总的来说,我的其余代码会尽可能使用Django ORM。

这里有一个关于该主题的Django问题,但到现在已经有1年半了:https://code.djangoproject.com/ticket/24709

顺便说一句,我的django版本:Django 2.1 (提到的django问题与v1.8一起提供)

再次感谢米哈伊尔的建议。