我的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']}
等。完全忽略了它。
答案 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