2016-10-31 5 views
1

環境:django.contrib.postgres.fields.JSONFieldからデータが返されるのはなぜですか?

  • ジャンゴ1.9.10
  • 自作

介してインストールのPython 3.5.2

  • MacOSのシエラに自作を介してインストールpsycopg2 2.6.2
  • のPostgreSQL 9.5.4例モデル:

    from django.db import models 
    from django.contrib.postgres.fields import JSONField 
    
    
    class Foo(models.Model): 
        data = JSONField() 
    

    私はオブジェクトを作成しようと、すべてが期待どおりに動作します。しかし

    from myapp.models import Foo 
    x = Foo() 
    x.data = {'some key': 'some value'} 
    x.save() 
    

    、私はそのデータを取得しようとすると、.data属性の値が文字列である:

    from myapp.models import Foo 
    x = Foo.objects.order_by('-id')[0] 
    # returns "{'some key': 'some value'}" 
    x.data 
    # returns <class 'str'> 
    type(x.data) 
    

    マイ質問:dictを元に戻すにはどうすればJSONフィールド内のデータを操作できますか?

    EDIT

    import json 
    json.loads(x.data) 
    # JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 
    

    私はeval()を使用することができますが、それは明らかに非常に危険です:プロパティ名と値を単一引用符ではなく二重引用符で囲まれているためjson.loads()を使用すると失敗します。

  • +1

    確かに、あなたはevalではなく 'json.loads()'を使うでしょう。 –

    +0

    'json.loads()'を使ってその文字列を目的のdictにすることはできますが、それは非常に奇妙です。私は 'JSONField'を使用するアプリケーションを持っていますが、これは起こりません。また、それが期待された振る舞いだった場合、例えば 'JSONField'や' TextField'の使用に大きな違いはありません。取得しているオブジェクトが 'x.data = {'some key': 'some value'}'で保存したオブジェクトとまったく同じであることを確かめますか? – lucasnadalutti

    +0

    @lucasnadaluttiこの例を実行する前にテーブルが空だったので、_only_オブジェクトなので正しいオブジェクトであることが保証されています。 また、 'json.loads()'が機能しない理由についての最新の編集を参照してください。 – drew

    答えて

    1

    それは(別のモデルのdetail_routeにPOSTが実行したアクションから産卵)私は、このフィールドを作成するために書かれたカスタムDRFのシリアライザは、DRFのCharFieldではなくJSONFieldを使用していたことが分かりました。うわー!

    関連する問題