Django的JSONField isnull查找

10
据我所知,您不能在Django原生的JSONField上使用__isnull查询。在互联网上,我找到了this无效的问题。 作为可能的解决方法,我们当然可以使用以下这些方法:
  1. model.objects.filter(field__contains={'key': None}),这不是很灵活,因为您可能需要查询多个键或其他内容。

  2. model.objects.exclude(field__key=True).exclude(field__key=False),这是hacky的,并且仅适用于布尔数据。

我希望有更好的方法((c) Raymond Hettinger)来解决这个问题。任何建议都将不胜感激。现在,我将采取第一种方法。
1个回答

6
根据此处(参见最后的关闭评论),以下代码应该有效model.objects.filter(field__key=None)(但显然您应使用修复版的Django版本)。 Django文档警告:

由于任何字符串都可以是JSON对象中的键,因此除了下面列出的查询之外的任何查询都将被解释为键查询。不会引发错误。输入时要特别小心,并始终检查查询是否按预期工作。

并且这里是它们。

似乎field__key__isnull=True也应该可以工作。终于在这些年之后,这个问题有了答案。谢谢! - valignatev
我无法让 field__key__isnull=True 正常工作。查看上面链接中的代码更改,JSONExact 查找被添加,因此对我来说 field__key__exact=None 也可以正常工作。 - djbp
JSONFields上的查询很容易隐藏错误,因为它们进行动态键查找而不引发错误。例如,运行 model.objects.filter(field__is_null=True)model.objects.filter(field__is_null=False) 错误地使用 is_null 而不是 isnull 将始终返回一个空的查询集,没有错误,因为它正在寻找一个叫做 is_null 的键。 - Ben Sturmfels
.exclude(field__key__isnull=True)在Django 4.1中仍然无效,但__exact=None有效。 - Tim Richardson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接