25

データベースに次のようなjsonフィールドがあります

jsonfield = {'username':'chingo','reputation':'5'}

ユーザー名が存在するかどうかを確認できるクエリを作成する方法を教えてください。何かのようなもの

username = 'chingo'
query = User.objects.get(jsonfield['username']=username)

上記のクエリが間違っていることはわかっていますが、アクセスする方法があるかどうか知りたいですか?

4

7 に答える 7

16

この使用法は、ややアンチパターンです。また、その実装では通常のパフォーマンスが得られず、おそらくエラーが発生しやすくなります。
通常、フィールドを検索する必要がある場合は、jsonfield を使用しないでください。ダニエルが指摘したように、RDBMS が提供する方法または MongoDB (より高速な BSON で内部的に動作する) を使用します。

JSON 形式の決定論により、contains(regex複数の場合に問題があり、さらに遅い)を使用してそれを達成できます。この方法で'\'使用するのは良くないと思うので、代わりに使用してください:usernamename

def make_cond(name, value):
    from django.utils import simplejson 
    cond = simplejson.dumps({name:value})[1:-1] # remove '{' and '}'
    return ' ' + cond # avoid '\"'

User.objects.get(jsonfield__contains=make_cond(name, value))

それは限り動作します

  • 同じダンプ ユーティリティを使用した jsonfield (simplejsonこちら)
  • nameあまり特別ではありvalue ません(これまでのところ、egde-caseは知りません。誰かが指摘できるかもしれません)
  • あなたのjsonfieldデータは壊れていません(そうではありませんが)

実際、私は編集可能な jsonfield に取り組んでおり、そのような操作をサポートするかどうかを考えています。否定的な証拠は、上で述べたように、黒魔術のように感じます。

于 2012-05-04T14:16:37.350 に答える
1

PostgreSQL を使用している場合は、生の SQL を使用して問題を解決できます。

username = 'chingo'
SQL_QUERY = "SELECT true FROM you_table WHERE jsonfield::json->>'username' = '%s'"
User.objects.extra(where=[SQL_EXCLUDE % username]).get()

you_tableデータベース内のテーブルの名前です。

プレーンテキストのように JSON を操作する場合のメソッドはすべて、非常に悪い方法のように見えます。ですから、データベースのより良いスキーマも必要だと思います。

于 2016-02-04T21:34:17.927 に答える
-1

そんなことはできません。JSON BLOB ではなく、構造化データには通常のデータベース フィールドを使用します。

JSON データを検索する必要がある場合は、MongoDB などの noSQL データベースの使用を検討してください。

于 2012-05-04T08:36:48.153 に答える