TortoiseORM:如何从Tortoise.contrip.Postgres.fields查询Postgres`Ar



刚刚通过from tortoise.contrib.postgres.fields import ArrayField在Tortoise ORM中创建了一个PostgresArrayField来托管我想要放置的一些标签。查看我的Postgres数据库,生成的字段确实是text[]类型,这很好,但我如何使用Tortoise query API来查询它?

我尝试过多次使用filter,但每次都会返回一个空列表或引发一个错误。

表格

+----+---------------+
| id | tags (text[]) |
+----+---------------+
| 1  | {foo,bar}     |
+----+---------------+
| 2  | {foo}         |
+----+---------------+
| 3  | {bar}         |
+----+---------------+
# End results
# Works but uses: CAST("tags" AS VARCHAR) LIKE '%foo%'
await Card.filter(tags__contains='foo').values_list('id', flat=True)   
# Doesn't work
await Card.filter(tags__search=['foo']).values_list('id', flat=True)     # error
await Card.filter(tags__search='foo').values_list('id', flat=True)       # error
await Card.filter(tags=['foo']).values_list('id', flat=True)             # error
await Card.filter(tags='foo').values_list('id', flat=True)               # error
await Card.filter(tags__in=['foo']).values_list('id', flat=True)         # []
await Card.filter(tags__in='foo').values_list('id', flat=True)           # []

使用settuple也进行了尝试,但结果相同。

更新

我还没有找到在TORM中查询ArrayField的方法,所以我使用了JSONField,它有更好的支持。

# Old
tags = ArrayField('text', null=True)    # can't query for now
# New
tags = JSONField(default=[])

我会把这个问题保留在这里,以防其他人也有同样的问题。

我也在考虑使用JSONField,尽管在Postgres Array中,字段在某些情况下更灵活。我在DBA社区中发现了这种比较。

我最终实现了我自己的类型化ArrayField:如何在Tortoise ORM 中使用Postgresql数组字段

在您的情况下,我想,您将需要为数组contains实现自己的筛选器运算符。举个例子,我会查看现有的过滤器:默认过滤器和contrib Postgres过滤器。

以下是contains操作符在PostgreSQL中的外观:Postgres:检查数组字段是否包含值?

希望这在某种程度上有所帮助:(

最新更新