如何查询和比较对象上JSONbField的值?

2024-09-20 06:31:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含jsonbfield的模型,需要查询字典的值。在查询中,我需要确保dictionary的所有值都是None,或者整个字段都是None。你知道吗

我的模型看起来像:

MyModel(models.Model):
    date_created=DatetimeField()
    json_dict = JSONField(default=dict, null=True)

基本上我想得到这样的东西:

MyModel.objects.filter(Q(json_dict={}) |Q(json_dict=None) | Q(all(v=None for v in json_dict.values())))

最重要的部分是

Q(all(v=None for v in json_dict.values()))

但我不能在查询中这样做。我想知道是否有一种方法可以在将结果保存在查询集中的同时检查它,而不是将其计算到列表中并在那里检查。你知道吗

限制:

  • 我不知道字典的键,因为它们对于MyModel中的每个对象都是不同的。你知道吗
  • 我必须能够使用bulk_create函数,所以覆盖save不是一个选项

Tags: in模型nonejsonfordatemodeldictionary
2条回答

在我看来,关于性能,最好的选择是创建一个新的计算字段,并根据它进行过滤:

MyModel(models.Model):
    date_created=DatetimeField()
    json_dict = JSONField(default=dict, null=True)
    is_empty = BooleanField(default=True, editable=False) #<-calculated field.

    def save(self, *args, **kwargs):
        self.is_empty = ( self.metadata is None or 
                          # self.json_dict=={} or ## other checks
                          all(v is None for v in self.json_dict.values()) )
        super().save(*args, **kwargs)  

现在,您的查询非常简单,而且索引友好:

MyModel.objects.filter( is_empty = True )

更多信息请访问djangoOverriding predefined model methods文档。你知道吗

正如docs所说,您只能定义一个可调用的默认值,例如dict。话虽如此,我相信您应该使用dict作为默认值,如果字段为空,您可以使用它进行过滤。有些人喜欢:

class MyModel(models.Model):
    json_dict = JSONField(default=dict)


MyModel.objects.filter(json_dict=dict())

相关问题 更多 >