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() 方法正确执行查询?提前致谢。
正如包含 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)
这也将返回您的对象。
| 归档时间: |
|
| 查看次数: |
3387 次 |
| 最近记录: |