Ошибка типа при попытке загрузить приборы с естественными ключами Content_type в Django - PullRequest
5 голосов
/ 08 февраля 2011

Я использую опцию --natural при выгрузке одной из моих моделей в фикстуры, чтобы не столкнуться с проблемой ID Content_typ при развертывании.Результаты здесь:

{
     "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

Кажется, что метод не принимает строку для загрузки.Чего мне не хватает?

1 Ответ

4 голосов
/ 09 февраля 2011

Я могу только догадываться прямо сейчас, но после просмотра исходного кода Django и вашего сообщения об ошибке, я думаю, что формат вашего прибора может быть поврежден. Пример, который вы опубликовали, это все содержимое файла? Если да, то я думаю, что вам нужно поместить эту модель в список, например так (обратите внимание на внешние скобки):

[
  {
    "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 - это объект json (эквивалентный словарю python), итерирование по которому даст вам только ключи, в данном случае pk, model, field. В строке 84 Django делает _get_model(d["model"]), то есть использует строку "model" в качестве индекса для другой строки, вероятно pk (который является первым элементом в object_list). Это ошибка типа.

Когда object_list является реальным списком, итерирование по нему даст вам словари, которые можно индексировать строками.

...