【发布时间】:2018-04-09 00:22:18
【问题描述】:
我有一个书本模型
class Book():
...
tags=JSONField()
我有一些记录:
Book(..., tags=['TECH', 'BUSINESS'])
Book(..., tags=['MARKETING'])
我想过滤掉带有“技术”或“商业”标签的图书
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?
【问题讨论】:
-
我刚刚尝试了上面的确切代码,它在 Postgresql 中对我来说工作得很好。你在使用 Postgresql 吗?
-
@solarissmoke 这是我的错误。我刚刚更新了问题
-
您的模型 sn-p 有一个错误:它应该是
tags = JSONField()而不是tags: JSONField()。 -
也许您可以实施验证,始终强制 JSONField 中的所有大写术语。如果数据格式一致,这将简化事情。
-
JSONField()的官方文档只讨论键值对。不过我会尝试values lookup。还有讨论标签的ArrayField()示例(仅适用于 postgresql)。但它没有提到icontains。我只能希望icontains也能正常工作。
标签: django django-mysql