【问题标题】:Django F expression and ArrayField positionDjango F 表达式和 ArrayField 位置
【发布时间】: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 查询来解决我的问题

标签: python django


【解决方案1】:

所以实际上在投入翻译后的 postgres 查询之后,很明显 django 的 F 表达式(仍然)不提供位置查找(并且可能不会实现)。

我会把这个作为答案,也许它可以帮助那些被困在同一点上的人。

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

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

顺便说一下,我的 django 版本:Django 2.1(提到的 django-issue 是 v1.8)

再次感谢 Mikhail 的建议。

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 2014-02-21
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2019-10-21
    • 2018-02-12
    • 2015-09-01
    相关资源
    最近更新 更多