【问题标题】:How to filter based on the last element in ArrayField in django如何根据django中ArrayField中的最后一个元素进行过滤
【发布时间】:2018-08-13 21:27:55
【问题描述】:

我正在使用允许具有数组数据类型的 postgresql 数据库,此外 django 还为此提供了 PostgreSQL 特定的模型字段。 我的问题是如何根据数组的最后一个元素过滤对象?

class Example(models.Model):
     tags = ArrayField(models.CharField(...))
example = Example.objects.create(tags=['tag1', 'tag2', 'tag3']
example_tag3 = Example.objects.filter(tags__2='tag3')

我想过滤但不知道标签的大小。是否有类似的动态过滤:

example_tag3 = Example.objects.filter(tags__last='tag3')

【问题讨论】:

  • 我明白你在问什么,但我不确定你为什么要这样做。执行此操作的方法可能包括在保存时将数组的长度返回到变量中,然后使用该变量作为过滤器。
  • 我正在使用 arrayField 来存储我感兴趣的变量的历史记录,所以我想获取最后一个值为 x 的所有记录。每个记录在我所说的标签中可能有不同数量的元素的问题。所以循环所有对象并获取标签的长度会破坏性能
  • 我认为您将不得不执行原始 SQL 查询来获取数组长度并在您的过滤器中使用它。其他人可能比我更了解,但这是我最好的建议。

标签: arrays django postgresql


【解决方案1】:

除了上述答案和评论之外,如果无法更改表结构,您可以使用 field__0 根据数组中的 first 元素过滤您的查询:

example_tag3 = Example.objects.filter(tags__0='tag1')

但是,我没有看到直接访问最后一个元素的方法in the documentation

【讨论】:

    【解决方案2】:

    我认为除了使用原始 SQL (see this) 之外,没有其他方法可以在不“降低性能”的情况下做到这一点。但是你应该避免做这样的事情,来自the doc

    提示:数组不是集合;搜索特定的数组元素可以 数据库设计错误的标志。考虑使用一个单独的表 将成为数组元素的每个项目的行。这会更容易 进行搜索,并且可能会更好地扩展大量 元素。

    【讨论】:

    • 嗯,是的,我认为你是对的,我阅读了所有文档,但找不到我需要的东西,所以,通过将元素添加到数组中来以相反的方式存储元素来解决我的问题附加它们,然后我通过检查第一个元素(受支持)进行过滤:)
    猜你喜欢
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2015-11-03
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多