Django:在 JSONField 上使用 F() 表达式?

blu*_*ote 7 python django

我有模型

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()表达式?

End*_*oth 7

您可以使用 plain values('fieldname__lookup'),因为values()从 v2.1 开始支持查找:

Product.objects.values('properties__color')
Run Code Online (Sandbox Code Playgroud)

F然而表达式不支持查找;事实上,他们默默地丢弃了它们,正如你的例子所证明的那样。

使用转换时,当您要查找的字段嵌套超过一层时,JSONField请注意错误。在链接的问题中,如果普通注释values()不够,您还可以找到使用命名注释的解决方案。