我有一个带有json字段的类
class A(models.Model)
brand = JSONField()
如果我发布了一个JSON数组,例如[{'brand_id:1','name':'b1'},{'brand_id:2','name':'b2'}],它会被存储为数组JSON。这很好。
我应该如何查询以检查该数组中任何字典的brand_id中是否存在“1”?
答案 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。