django jsonfield查询一个数组值

时间:2016-02-01 16:11:38

标签: django postgresql django-models

我有这个型号:

class InventoryItem(models.Model):
    size_range = JSONField(null=True)  # JSONField in Django 1.9

我填写了以下数据:

InventoryItem.objects.create(size_range={'size': ['S', 'M', 'L']})

但是当我做以下查询时:

InventoryItem.objects.filter(size_range__size__contains='S')

我收到以下错误:

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

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

'SELECT "app_name_inventoryitem"."id", 
"app_name_inventoryitem"."size_range", FROM 
"app_name_inventoryitem" WHERE 
"app_name_inventoryitem"."size_range" -> \'size\' @> S'

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

2 个答案:

答案 0 :(得分:4)

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

您可以执行以下操作

InventoryItem.objects.filter(size_range__size__contains=['S'])

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

InventoryItem.objects.filter(size_range__size__contains=['K'])

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

您还可以执行以下操作:

InventoryItem.objects.filter(size_range__size__contains=['S', 'M'])

这也将返回你的对象。

答案 1 :(得分:1)

我有一段时间没有使用过django,但是,这可能是你在哪里寻找的吗?

InventoryItem.objects.filter(size_range__size__contains=['S'])