21

新しい JSONField を使用して Django 1.9 を実行し、次の Test モデルを使用します。

class Test(TimeStampedModel):
    actions = JSONField()

アクション JSONField が次のようになっているとします。

[
  {
    "fixed_key_1": "foo1",
    "fixed_key_2": {
      "random_key_1": "bar1",
      "random_key_2": "bar2",
    }
  },
  {
    "fixed_key_1": "foo2",
    "fixed_key_2": {
      "random_key_3": "bar2",
      "random_key_4": "bar3",
    }
  }
]

リストのすべての項目に対して foo1 および foo2 キーをフィルタリングできるようにしたいと考えています。私がする時 :

>>> Test.objects.filter(actions__1__fixed_key_1="foo2")

テストはクエリセットにあります。しかし、私がするとき:

>>> Test.objects.filter(actions__0__fixed_key_1="foo2")

そうではありません。私は次のようなことをしたい:

>>> Test.objects.filter(actions__values__fixed_key_1="foo2")

または

>>> Test.objects.filter(actions__values__fixed_key_2__values__contains="bar3")

そして、クエリセットにテストを入れます。

これができるかどうか、そしてどのように考えていますか?

4

3 に答える 3

11

__containsこれに対してルックアップを使用し、クエリされた値をリストとして渡すことができるはずです。ルックアップは、ArrayField とまったく同じように動作します。したがって、次のようなものが機能するはずです。

Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
于 2015-12-18T15:52:43.917 に答える
3

django-jsonfieldパッケージを使用できます。すでに使用しているものだと思います。

from jsonfield import JSONField
class Test(TimeStampedModel):
    actions = JSONField()

したがって、特定のプロパティで検索を行うには、次のようにします。

def test_filter(**kwargs):
    result = Test.objects.filter(actions__contains=kwargs)
    return result

PostgreSQL を使用している場合は、PostgreSQL固有のモデル フィールドを利用できる可能性があります。

PS: 多くの JSON 構造を扱っている場合は、NoSQL データベースの使用を検討する必要があるかもしれません。

于 2015-12-18T15:27:49.227 に答える