如何注释 Django JSONField (对象数组)数据的总和?

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

all*_*usw 1

我没有使用过 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)