过滤 JSONField 数组
Filter on JSONField array
我有书本模型
class Book():
...
tags=JSONField()
我有一些记录:
Book(..., tags=['TECH', 'BUSINESS'])
Book(..., tags=['MARKETING'])
我想过滤掉标签为 'Tech' 或 'Business'
的图书
query = Q (
Q(tags__contains='Tech') |
Q(tags__contains='Business')
)
我试过使用 contains、contained_by、has_key、has_any_keys 但没有成功。
结果总是空的。
更新
是我的错!
我发现问题了,JSONField是区分大小写的。
DB 中保存的值是 ["TECH", "BUSINESS"]
而不是 ["Tech", "Business"]
。
现在问题变成了How to search in a case-insensitive manner?
可以使用 icontains
:
执行不区分大小写的搜索
query = Q(
Q(tags__icontains='tech') |
Q(tags__icontains='business')
)
这里给官方link一个documentation.
我已经在 Django-MySQL 存储库上回复了您的问题:https://github.com/adamchainz/django-mysql/issues/401 . Basically it seems this can't be done as MySQL JSON values are case sensitive only, as per https://dev.mysql.com/doc/refman/5.7/en/json.html
我有书本模型
class Book():
...
tags=JSONField()
我有一些记录:
Book(..., tags=['TECH', 'BUSINESS'])
Book(..., tags=['MARKETING'])
我想过滤掉标签为 'Tech' 或 'Business'
的图书query = Q (
Q(tags__contains='Tech') |
Q(tags__contains='Business')
)
我试过使用 contains、contained_by、has_key、has_any_keys 但没有成功。 结果总是空的。
更新
是我的错! 我发现问题了,JSONField是区分大小写的。
DB 中保存的值是 ["TECH", "BUSINESS"]
而不是 ["Tech", "Business"]
。
现在问题变成了How to search in a case-insensitive manner?
可以使用 icontains
:
query = Q(
Q(tags__icontains='tech') |
Q(tags__icontains='business')
)
这里给官方link一个documentation.
我已经在 Django-MySQL 存储库上回复了您的问题:https://github.com/adamchainz/django-mysql/issues/401 . Basically it seems this can't be done as MySQL JSON values are case sensitive only, as per https://dev.mysql.com/doc/refman/5.7/en/json.html