【问题标题】:Filter on JSONField array过滤 JSONField 数组
【发布时间】: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


【解决方案1】:

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

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

这里是官方documentation的链接。

【讨论】:

  • 我刚刚检查过,但它抛出了这个异常Lookup 'icontains' doesn't work with JSONField。顺便说一句,谢谢你的建议。
  • 是的,你在写。我没注意。真烦人!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2018-08-22
    • 1970-01-01
    • 2018-10-02
    • 2023-03-28
    • 1970-01-01
    • 2020-10-08
    • 2016-03-25
    • 2022-11-30
    相关资源
    最近更新 更多