0

我的 JSONField 包含这样的数据:

class Car(models.Model):
   data = JSONField()
Car.objects.first().data

{
    u'colors': [
        {u'color_id': u'1', u'source': u'Manufacturer 3'},
        {u'color_id': u'2', u'source': u'Manufacturer 2'},
        {u'color_id': u'3', u'source': u'Manufacturer 1'},
    ]
}

我知道我可以过滤结果:

Car.objects.filter(data__colors__contains=[{'color_id':'3'}])

有什么方法可以注释查询集,以便“color_id”包含在列表中?就像是:

Car.objects.all().annotate(color_ids=...)

这将使我能够做到:

Car.objects.first().color_ids
['3', '2', '1']

或者类似的东西,只是用 color_id 值过滤。使用 Django 1.11 和 Postgres 13。

4

1 回答 1

0

我认为您可以使用KeyTransform获取 json 值和ArrayAgg()获取列表:

from django.contrib.postgres.fields.jsonb import KeyTransform

Car.objects.annotate(colors=KeyTransform("data", "colors")).annotate(color_id=KeyTransform("colors", "color_id")).annotate(colors_ids=ArrayAgg('color_id'))
于 2022-02-16T10:56:17.717 回答