过滤JSONField数组

时间:2017-10-27 11:47:09

标签: django django-mysql

我有一本书模型

class Book():
  ...
  tags=JSONField()

我有一些记录:

Book(..., tags=['TECH', 'BUSINESS'])
Book(..., tags=['MARKETING'])

我想过滤掉那些标有' Tech'或者'商业'

query = Q (
    Q(tags__contains='Tech') |
    Q(tags__contains='Business')
)

我试过使用contains,contained_by,has_key,has_any_keys但没有运气。 结果总是空的。

更新

这是我的错! 我发现了问题,JSONField区分大小写。

保存在数据库中的值为["TECH", "BUSINESS"]而不是["Tech", "Business"]

现在问题是How to search in a case-insensitive manner?

2 个答案:

答案 0 :(得分:1)

可以使用icontains执行不区分大小写的搜索:

query = Q(
    Q(tags__icontains='tech') |
    Q(tags__icontains='business')
)

以下是官方documentation的链接。

答案 1 :(得分:0)

我在Django-MySQL回购中回复了你的问题:https://github.com/adamchainz/django-mysql/issues/401。基本上似乎无法做到这一点,因为MySQL JSON值仅区分大小写,如https://dev.mysql.com/doc/refman/5.7/en/json.html