2016-04-03 8 views
0

私はPostgreSQLとDjango 1.9、JSONFieldのこの新しいフィールドを使用しています。私は、JSONのこのリストにフィルタリングする方法を把握しようとしているDjango JSONFieldフィルタリング

id|data 
1 |[{'animal': 'cat', 'name': 'tom'}, {'animal': 'dog', 'name': 'jerry'}, {'animal': 'dog', 'name': 'garfield'}] 

:だから私は、次のデータを得ました。私は次のようなものを試しました:object.filter(data__contains={'animal': 'cat'}しかし、私はこれが道ではないことを知っています。また、私は、この値を取得し、私のコードでそれをフィルタリングで考えてきた:ジャンゴJSONField docs 1として

[x for x in data if x['animal'] == 'cat'] 
+0

あなたは包括的なドキュメンテーション[querying JSONField](https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#querying-jsonfield)にありますか?不明な点は何ですか? –

答えて

4

を、それがdata構造がわずかに異なるアプローチで、Pythonのネイティブフォーマットと一致していることを照会するときにことを説明しています。

あなたはJSONの構造を知っていれば、彼らは関連分野であるかのように、あなたもキーにフィルタリングすることができます:配列アクセスすることで

object.filter(data__animal='cat') 
object.filter(data__name='tom') 

object.filter(data__0__animal='cat') 

あなたcontains例はほとんど正しいですあなたのデータはリストにあり、次のものが必要です:

object.filter(data__contains=[{'animal': 'cat'}]) 
+0

それは、ありがとう!もう1つだけ、日付をフィルタリングできますか? 「動物」の代わりに「start_date」というキーがあります。これはISO 8601形式の日付を含みます – ezdookie

+0

文字列としてしか格納されていないので、私はできないと思います。私はあなたがすべての日付を取り出して、それらをPythonで比較しなければならないと思います。可能ならば、 'data__datetime__lte = other_datetime'または他のクエリショートカットのどれかを比較することでテストできます。 – Airith

+0

はい、それは動作しますが、要素配列 'data__0__datetime__lte = '2015-03-12''にのみアクセスします。リスト全体を検索する他の方法を思いついていますか?ありがとうございました! – ezdookie

関連する問題