我正在使用django 1.9及其内置的JSONField和postgres 9.4.在我的模型的JSONFieldjson字段中,我使用一些值存储对象,包括数字.我需要聚合它们来找到最小/最大值.像这样的东西:
Model.objects.aggregate(min=Min('attrs__my_key'))
Run Code Online (Sandbox Code Playgroud)
提取特定密钥也很有用:
Model.objects.values_list('attrs__my_key', flat=True)
Run Code Online (Sandbox Code Playgroud)
上述查询失败attrs:"无法将关键字'my_key'解析为字段.不允许加入'attrs'."
有可能吗?
注意:1)我知道如何进行简单的postgres查询来完成这项工作,所以我专门搜索ORM解决方案,以便能够过滤等.2)我想这可以用(相对)新的查询表达式/查找api完成但是我还没有研究过它.
我正在使用Django 1.9和Postgres 9.5.我有一个MyModel带JSONField(django.contrib.postgres.fields)的模型().JSON值在模型中的所有对象中具有相同的结构.
{
"key1": int_val_1,
"key2": int_val_2
}
Run Code Online (Sandbox Code Playgroud)
我想通过我的指定键的值来命令我的查询集JSONField.就像是
MyModel.objects.annotate(val=F('jsonfield__key1')).order_by('val')
Run Code Online (Sandbox Code Playgroud)
这不起作用 - 我收到以下错误
Cannot resolve keyword 'key1' into field. Join on 'jsonfield' not permitted.
Run Code Online (Sandbox Code Playgroud)
无论如何我能做到这一点吗?
我有模型
class Product(Model):
properties = JSONField()
Run Code Online (Sandbox Code Playgroud)
查询时
Product.objects.values('properties__color')
Run Code Online (Sandbox Code Playgroud)
我得到了正确的结果
从产品中选择 product.properties->color
但是,当我在做我认为等效的事情时
Product.objects.values(color=F('properties__color'))
Run Code Online (Sandbox Code Playgroud)
执行的查询完全不同
SELECT product.properties AS color FROM product
这是 django 的 JSONField 的错误,还是我误解了F()表达式?