针对JSONField的Django模型过滤器,其中的键包含连字符/破折号

时间:2019-11-25 16:48:52

标签: python django postgresql

我试图在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’
}

2 个答案:

答案 0 :(得分:2)

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

kwargs = {
   'data__8d8dd642-32cb-48fa-8d71-a7d6668053a7': 'bob'
}
MyModel.objects.filter(**kwargs)

答案 1 :(得分:1)

这看起来很困难,而且我不是100%确信我所拥有的会起作用。

您可以尝试使用JsonField contains查找。由于HStoreField的共享功能,因此在文档中对其进行了详细说明。

这看起来像这样:

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

我认为这将使您避开查找需要为有效的Python变量名称的事实。