刚在Tortoise中创建了一个Postgres ArrayField,通过from tortoise.contrib.postgres.fields import ArrayField托管一些我想放的标签。看看我的postgres,生成的字段确实是text[]类型的,这很好,但是我如何使用Tortoise来准确地查询它呢?
我尝试过几次使用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) # []也尝试了使用set或tuple,但结果是一样的。
将更多地搜索来源,但是任何帮助都是非常感谢的,船长。
“愿你的虫子轻一点,你那袋多力多士薯片重一点。”--我。
更新:
我还没有找到一种在TORM中查询ArrayField的方法,所以我使用的是JSONField,它有更好的支持。
# Old
tags = ArrayField('text', null=True) # can't query for now
# New
tags = JSONField(default=[])如果其他人有同样的问题,这个问题就留在这里。
发布于 2022-08-02 06:31:41
我也在考虑使用JSONField,尽管在Postgres字段中,在某些情况下比较灵活。我找到了DBA社区中的这种比较。
最后,我实现了自己的类型化ArrayField:如何在Tortoise-ORM中使用Postgresql数组字段
在您的情况下,我想您将需要为数组包含实现自己的filter操作符。我将查看现有过滤器中的一个例子:默认过滤器和滤波器。
下面是包含操作符在PostgreSQL本身中的外观:Postgres:检查数组字段是否包含值?
希望这是有帮助的:)
https://stackoverflow.com/questions/73192631
复制相似问题