我对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
答案 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一起提供)
再次感谢米哈伊尔的建议。