Django 模型过滤器以 JSONField 为目标,其中键包含连字符/破折号

Posted

技术标签:

【中文标题】Django 模型过滤器以 JSONField 为目标,其中键包含连字符/破折号【英文标题】:Django model filter targeting JSONField where the keys contain hyphen / dash 【发布时间】:2020-03-21 00:33:18 【问题描述】:

我正在尝试在 JSONField 上应用模型过滤器,但 JSON 中的键是 UUID。

那么什么时候做类似...

MyModel.objects.filter(data__8d8dd642-32cb-48fa-8d71-a7d6668053a7=‘bob’)

... 我得到一个编译错误。 UUID 中的连字符是问题所在。

如果有转义字符或其他要使用的行为,有什么线索吗?我的数据库是 PostgreSQL。

更新 1 - 现在添加了 JSON


   ‘8d8dd642-32cb-48fa-8d71-a7d6668053a7’: ’8d8dd642-32cb-48fa-8d71-a7d6668053a7’,
   ‘9a2678c4-7a49-4851-ab5d-6e7fd6d33d72’: ‘John Smith’,
   ‘9933ae39-1a27-4477-a9f4-3d1839f93fb4’: ‘Employee’

【问题讨论】:

你能发一个json例子吗? 【参考方案1】:

这看起来很困难,而且我不是 100% 相信我所拥有的会奏效。

您可以尝试使用JsonField contains 查找。查找在HStoreField 的文档下有更多解释,因为它是共享功能。

看起来像这样:

MyModel.objects.filter(data__contains='8d8dd642-32cb-48fa-8d71-a7d6668053a7': 'bob')

我认为这将允许您规避查找需要是有效的 Python 变量名这一事实。

【讨论】:

这完美地完成了这项工作【参考方案2】:

我遇到了同样的问题,我无法使用__contains,并发现您可以使用**kwargs 解包来使其工作,这允许您将过滤器作为字符串传递(这也很有用如果您需要动态过滤器):

kwargs = 
   'data__8d8dd642-32cb-48fa-8d71-a7d6668053a7': 'bob'

MyModel.objects.filter(**kwargs)

【讨论】:

【参考方案3】:

如果您还想搜索通配符(使用上面的示例)

这基本上会搜索 LIKE %bob%

kwargs = 
   'data__8d8dd642-32cb-48fa-8d71-a7d6668053a7__icontains': 'bob'

MyModel.objects.filter(**kwargs)

【讨论】:

以上是关于Django 模型过滤器以 JSONField 为目标,其中键包含连字符/破折号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中的 postgres JSONField 上应用过滤器?

如何在具有 Jsonfield 的模型中发布 django rest 中的数据

Django 1.9 JSONField 更新行为

Django中的JSONField即使在POST请求后仍保持为空

Django JSONField 过滤

Django 查询集过滤空 JSONField