2

使用 Django 1.9 和 Postgres 9.4。

我有一个名为 .jsonb 的字段json_fieldjson_field可以包含title看起来像'the cow jumped over the moon'.

所以我想搜索title包含的行moon

它使用以下原始 SQL 正常工作

SELECT * FROM web_file where (json_field ->> 'title')::text LIKE '%moon%';

但我宁愿使用 Django ORM。

编辑:

我想尝试(正如@kloddant 所指出的那样)

title = WebFile.objects.filter(json_field__title__contains='moon')

但它给出了以下错误

DataError: invalid input syntax for type json
LINE 1: ...le" WHERE "web_file"."json_field" -> 'title' @> 'moon' ORD...
                                                            ^
DETAIL:  Token "moon" is invalid.
CONTEXT:  JSON data, line 1: moon

这是相关的models.py

from django.contrib.postgres.fields import JSONField

class WebFile(MPTTModel):
    json_field = JSONField(null=True, blank=True, default=dict())

这可能是 django 模型和 MPTTModel 之间的冲突,尽管我对此表示怀疑?

4

3 回答 3

2

https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/

你会做这样的事情:

WebFile.objects.filter(json_field__title__contains='moon')
于 2016-04-15T16:10:18.563 回答
0

你不使用JSONFieldfromdjango.contrib.postgres.fields吗?在这种情况下,它会是这样的

WebFile.objects.filter(json_field__title__contains='moon')

你能发布相关的models.py吗?此外,如果您不使用django.contrib.postgres.fields和依赖默认模型(例如手动扩展 aCharField或其他东西),您将很难过。

于 2016-04-15T16:24:53.940 回答
0
title = WebFile.objects.filter(title__icontains=moon)

当然,您必须首先创建 WebFile 模型并将其从 models.py 文件中导入页面顶部。

于 2016-04-15T16:11:36.483 回答