1
環境:django.contrib.postgres.fields.JSONFieldからデータが返されるのはなぜですか?
- ジャンゴ1.9.10
- 自作
介してインストールのPython 3.5.2
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()
を使用すると失敗します。
確かに、あなたはevalではなく 'json.loads()'を使うでしょう。 –
'json.loads()'を使ってその文字列を目的のdictにすることはできますが、それは非常に奇妙です。私は 'JSONField'を使用するアプリケーションを持っていますが、これは起こりません。また、それが期待された振る舞いだった場合、例えば 'JSONField'や' TextField'の使用に大きな違いはありません。取得しているオブジェクトが 'x.data = {'some key': 'some value'}'で保存したオブジェクトとまったく同じであることを確かめますか? – lucasnadalutti
@lucasnadaluttiこの例を実行する前にテーブルが空だったので、_only_オブジェクトなので正しいオブジェクトであることが保証されています。 また、 'json.loads()'が機能しない理由についての最新の編集を参照してください。 – drew