过滤Django查询集以获取dict值

时间:2017-11-28 21:16:15

标签: python django python-3.x django-queryset

我的Products查询集JSONField attributes包含dict

class Product(models.Model):
attributes = JSONField(
    pgettext_lazy('Product field', 'attributes'),
    encoder=DjangoJSONEncoder, default={})

我想过滤Products

所在的attributes['12'] == '31'

以下作品之一:

qs.filter(attributes__contains={'12': '31'})

以下不会:

qs.filter(attributes__12='31') 这是我可以通过PostgreSQL实现的,还是应该将其移至ES?

编辑: 不幸的是我无法使用第一个解决方案,因为此dict可能包含更多密钥。

首先解决方案效果很好。鉴于我们有:

product.attributes = {'333': ['6', '1']}

我们可以通过以下方式过滤掉它:

Product.objects.filter(attributes__contains={'333': ['6']}

等。完全忽略了它。

1 个答案:

答案 0 :(得分:2)

您应该能够使用第二种格式,即qs.filter(attributes__key='value')

在这种情况下,您的问题是explained in the docs,当在JSON查询中使用整数作为键时,该键将用作数组的索引,因此它被解释为attributes[12]代替attributes['12']

只要您坚持使用字符串键,就可以了。

一个例子:

class MyModel(models.Model)
    json = JSONField(default=dict)


p = MyModel.objects.create(json={'0': 'something', 'a': 'something else'})

MyModel.objects.filter(json__0='something') # returns empty queryset
MyModel.objects.filter(json__a='something else') # returns the object created above