Django Postgres JSONField查询

时间:2018-05-09 10:49:16

标签: django python-3.x postgresql django-rest-framework

我有一个带有json字段的类

class A(models.Model)
    brand = JSONField()

如果我发布了一个JSON数组,例如[{'brand_id:1','name':'b1'},{'brand_id:2','name':'b2'}],它会被存储为数组JSON。这很好。

我应该如何查询以检查该数组中任何字典的brand_id中是否存在“1”?

2 个答案:

答案 0 :(得分:2)

首先,你的JSON在这里是不正确的。我认为它应该是:

[{'brand_id': 1, 'name': 'b1'}, {'brand_id': 2, 'name': 'b2'}] 

如果是这种情况,要在这样的blob中测试1,这样的内容会告诉您是否在JSON中找到{em> 的1作为值:

def check_for_one(json_data):
    return any([1 in data.values() for data in json_data])

但是,您想要特别了解1是否为密钥所拥有的值 JSON中的任何位置brand_id,因此您还可以使用循环添加一些额外条件:

def check_for_one(json_data):
    match = []
    for data in json_data:
        for key, value in data.items():
            if key == 'brand_id' and value == 1:
                match.append(True)
    return any(match)

您可以将此类逻辑作为方法合并到模型类中,如下所示:

class A(models.Model):
    brand = JSONField()

    def check_for_one_comprehension(self):
        return any([1 in data.values() for data in self.brand])

    def check_for_one_loop(self):
        match = []
        for data in self.brand:
            for key, value in data.items():
                if key == 'brand_id' and value == 1:
                    match.append(True)
        return any(match)

但是,如果你真的想要从数据库中过滤实例,其中JSON数据是顶级数组brand_id == 1,那么这需要采用不同的方法,这应该是这样做的:

A.objects.filter(brand__contains=[{'brand_id': 1}])

请注意额外的[{}]大括号!如果您只是致电contains=['brand_id': 1],则会引发语法错误,如果您致电contains={'brand_id': 1}则不会匹配。

答案 1 :(得分:1)

这有效:

A.objects.filter(brands__contains=['brand_id':1])

我没有先使用数组检查它。 @Bear Brown指出的链接提供了足够的信息。 它很容易在django,但找到它需要时间:P。