2016-04-15 10 views
2

Django 1.9とPostgres 9.4を使用しています。このSQL文のdjango ORMバージョンはありますか?

json_fieldというjsonbフィールドがあります。 json_fieldには、のように見えるtitleというキーを含めることができます。

titleにはmoonが含まれている行を検索したいと思います。

それは正しく

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

次生のSQLを使用して動作しますが、私はむしろ、DjangoのORMを使用してそれを行うだろう。

EDIT:

私は

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

してみてください(と@kloddantで指摘したように)と考えられますが、それはここで

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の間に衝突があるかもしれませんが、疑わしいですか?

+0

JSONFieldフィールドタイプはどこから来ますか?これはDjangoの一部ではなく、MPTTの一部でもありません。 –

+0

@MadWombat Django 1.9の新機能https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#jsonfield –

+0

ドキュメントを読むことをお勧めします。 JSONFieldは文字列ではないので、 '__contains'フィルタは文字列と同じように動作しません。 https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#querying-jsonfield –

答えて

2

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

次のようなものだろう:もちろん

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

私は同じと思っていましたが、 ' DataError:タイプjsonの入力構文が無効です LINE 1:... le" WHERE "web_file"。 "json_field" - > 'title' @> 'moon' ORD ... ^ 詳細:トークン「月」が無効です。 CONTEXT:JSONデータ、1行目:月 ' –

+0

これはちょっと変わったことです。 'WebFile.object.filter(json_field__title = 'moon')'は動作します(つまり、 'moon'というタイトルのものを見つけ出すのですか?多分それは '__contains'と関係しているでしょうか? – semicolon

0
title = WebFile.objects.filter(title__icontains=moon) 

を、あなたはWebFileモデルが最初に作成されており、モデルからのあなたのページの上部にそれをインポートする必要があります。 pyファイル。

+0

'title 'が' json_field'に含まれているので作業ができません –

+0

データベースフィールドにjsonオブジェクトがある場合、可能であればデータベースを再構築して、すべてのjsonデータが別のテーブルにあるようにします外部キーを使用してwebfileテーブルにリンクされています。 – kloddant

+1

アプリケーションユーザーが独自のスキーマレスキー値ペアを作成したいと思うユースケースがあり、ユーザーごとに新しいテーブルを作成する必要はありません。私のユースケースは、Postgres 9.4 jsonbができるものと非常によく似ていると思います。 –

0

JSONFielddjango.contrib.postgres.fieldsから使用していませんか?その場合には、それだけで何かlike this次のようになります。

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

あなたは、関連するmodels.pyを投稿することができますか?また、django.contrib.postgres.fieldsを使用せず、デフォルトのモデル(手動でCharFieldなどを拡張するなど)に依存している場合は、苦労するでしょう。

+0

私は 'model.py'を投稿しました –

+0

投稿したアプローチを試しましたか?問題は、 'title'が' WebFile'の属性ではないので、 'title'でオブジェクトをフィルタリングできないということです。また、 'default'は呼び出し可能でなければなりません。空のデフォルトには 'dict'を使います。ドキュメントから: "デフォルト= {}を間違って使用すると、JSONFieldのすべてのインスタンスで共有される変更可能なデフォルトが作成されます。 –

+0

はい、あなたのアプローチを試みましたが、私はエラーを受け取りました(私は質問にエラーを含めました)。デフォルトのポインタをありがとう。 –

関連する問題