如何根据django中ArrayField中的最后一个元素进行过滤

问题描述 投票:0回答:3

我正在使用 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')
arrays django postgresql
3个回答
2
投票

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

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


1
投票

添加上述答案和评论,如果无法更改表结构,您可以使用 field__0:

 根据数组中的 
first

元素过滤查询
example_tag3 = Example.objects.filter(tags__0='tag1')

但是,我在文档中没有看到直接访问最后一个元素的方法。


0
投票
我建议您将

ArrayField

 转为仅包含列表的 
JSONField

然后你可以这样过滤:

class Post(models.Model): tags = models.JSONField() first_tag = Post.objects.filter(tags__0="python") last_tag = Post.objects.filter(**{"tags__-1": "java"})
请注意,使用 -1 语法时需要进行字典解包以避免语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.