Bim*_*dey 7 django django-aggregation django-postgresql django-jsonfield django-3.0
我有这样的模型
# models.py
class MyModel( models.Model ):
orders = models.JsonField(null= True, blank=True, default=list)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
我在这个结构中存储了 json 数据。
[
{
"order_name": "first order",
"price": 200
},
{
"order_name": "second order",
"price": 800
},
{
"order_name": "third order",
"price": 100
}
]
Run Code Online (Sandbox Code Playgroud)
我想计算所有 json 对象的价格总和,即 200+800+100
我没有使用过 JSONArrayField,但我做了一些研究,发现以下示例可以为您提供线索:
MyModel.objects.annotate(
order_price_sum=Sum(
Cast(
KeyTextTransform("price", "orders"), models.FloatField()
)
),
)
Run Code Online (Sandbox Code Playgroud)
我尝试将其实现到您的具体问题,您可以在以下链接中找到更多有用的信息:https ://dev.to/saschalalala/aggregation-in-django-jsonfields-4kg5
解决方法:我试图弄清楚如何使用 django 中的注释来管理 JSONArray,但它似乎没有详细记录,所以我分享这个解决方法来实现目标:
total = 0
for i in MyModel.objects.exclude(orders__isnull=True).values('orders'):
total += sum([j.get('price',0) for j in i.get('orders') if j is not None])
Run Code Online (Sandbox Code Playgroud)