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 中的数据