2011-02-08 8 views
4

私のモデルの1つをフィクスチャにダンプするときに--naturalオプションを使用しているので、デプロイ時にContent_typ IDの問題に遭遇しません。結果はここにある:DjangoでContent_typeナチュラルキーを使用してフィクスチャをロードしようとするとエラーが発生しました

{ 
    "pk": 1, 
    "model": "seo.opportunitymetadatamodel", 
    "fields": { 
     "_content_type": [ 
       "opportunity", 
       "jobopportunity" 
     ], 
     "og_description": "", 
     "description": "", 
     "title": "test", 
     "keywords": "", 
     "og_title": "", 
     "heading": "" 
    } 
} 

しかし、私はフィクスチャをバックロードしようとすると、私は次のエラーを取得する:方法は、ロードする文字列を受け付けないように

Problem installing fixture 'seo/fixtures/initial_data.json': Traceback (most recent call last): 
    File "/Users/xx/dev/envs/xx/lib/python2.6/site-packages/django/core/management/commands/loaddata.py", line 167, in handle 
    for obj in objects: 
    File "/Users/xx/dev/envs/xx/lib/python2.6/site-packages/django/core/serializers/json.py", line 38, in Deserializer 
    for obj in PythonDeserializer(simplejson.load(stream), **options): 
    File "/Users/xx/dev/envs/xx/lib/python2.6/site-packages/django/core/serializers/python.py", line 84, in Deserializer 
    Model = _get_model(d["model"]) 
TypeError: string indices must be integers, not str 

は思えます。私は何が欠けていますか?

答えて

3

私はただちに推測できますが、Djangoのソースコードとエラーメッセージを見てから、あなたのフィクスチャのフォーマットが壊れていると思います。投稿した例は、フ​​ァイルの内容全体ですか? yesの場合、私はあなたがこのように、リストでそのモデルを配置する必要があると思う場合は(外側ブラケットに注意を払う):

[ 
    { 
    "pk": 1, 
    "model": "seo.opportunitymetadatamodel", 
    "fields": { 
     "_content_type": [ 
     "opportunity", 
     "jobopportunity" 
     ], 
     "og_description": "", 
     "description": "", 
     "title": "test", 
     "keywords": "", 
     "og_title": "", 
     "heading": "" 
    } 
    } 
] 

なぜ? DjangoがJSONデータを正常に解析した後、このデータはPythonデシリアライザに渡されます。データの上にこの繰り返し処理を次のように

82  for d in object_list: 
83   # Look up the model and starting build a dict of data for it. 
84   Model = _get_model(d["model"]) 

http://code.djangoproject.com/browser/django/trunk/django/core/serializers/python.py#L82

object_listは(Pythonの辞書に相当)JSONオブジェクトである想像し、それを反復することはこの場合のみpk, model, fieldには、あなたのキーを取得します。 Djangoは_get_model(d["model"])という行を返します。つまり、"model"という文字列を別の文字列のインデックスとして使用すると、おそらくpk(これはobject_listの最初の要素です)。それは型エラーです。

object_listが実際のリストである場合、それを反復することで、辞書で文字列で索引付けすることができます。

+0

笑....どういうわけか私はそれが私がそれらを初めて使用したときの自然な鍵使用の原因から来ていると思った。今、愚かな感じ;-) – philgo20

関連する問題