django jsonfield 查询一个数组值

Amr*_*nia 7 django postgresql django-models

我有这个模型:

class InventoryItem(models.Model):
    size_range = JSONField(null=True)  # JSONField in Django 1.9
Run Code Online (Sandbox Code Playgroud)

我在其中填充了以下数据:

InventoryItem.objects.create(size_range={'size': ['S', 'M', 'L']})
Run Code Online (Sandbox Code Playgroud)

但是当我执行以下查询时:

InventoryItem.objects.filter(size_range__size__contains='S')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

django.db.utils.DataError: invalid input syntax for type json
LINE 1: ..._inventoryitem"."size_range" -> 'size' @> 'S' LIMIT ...
                                                         ^
DETAIL:  Token "S" is invalid.
CONTEXT:  JSON data, line 1: S
Run Code Online (Sandbox Code Playgroud)

如何使用 .filter() 方法正确执行查询?这是 .filter() 方法生成的 SQL 查询:

'SELECT "app_name_inventoryitem"."id", 
"app_name_inventoryitem"."size_range", FROM 
"app_name_inventoryitem" WHERE 
"app_name_inventoryitem"."size_range" -> \'size\' @> S'
Run Code Online (Sandbox Code Playgroud)

如何使用 .filter() 方法正确执行查询?提前致谢。

Ahm*_*sny 6

正如包含 operator 的文档中所述,接受任何 JSON 而不仅仅是字符串字典。 https://docs.djangoproject.com/en/dev/ref/contrib/postgres/fields/#containment-and-key-operations

您可以执行以下操作

InventoryItem.objects.filter(size_range__size__contains=['S'])
Run Code Online (Sandbox Code Playgroud)

这将返回对象,如果您执行以下操作

InventoryItem.objects.filter(size_range__size__contains=['K'])
Run Code Online (Sandbox Code Playgroud)

它将返回一个空的查询集。

您还可以执行以下操作:

InventoryItem.objects.filter(size_range__size__contains=['S', 'M'])
Run Code Online (Sandbox Code Playgroud)

这也将返回您的对象。