Использует ли django YML grok ?django не загружает YML-файл fixtures (yml не является известной сериализацией)

StackOverflow https://stackoverflow.com/questions/3880931

Вопрос

Я успешно создал свой первый проект django.

У меня есть два приложения в моем проекте foo и foobar.

Я создал папку с именем "fixtures" в каждой из папок приложения.Я НЕ указал каталог fixtures в своем settings.yml, поэтому (согласно документам), django должен искать в моей папке {app} / fixtures.

В папке {app} / fixtures у меня есть несколько файлов YML.Я разделил исходные данные для различных модулей на отдельные файлы YML, убедившись, что нет межфайловых зависимостей (т.е.все связанные модели находятся в одном файле YML, и предки встречаются в файле перед моделями, которые их используют).

Однако, когда я запускаю./manage.py syncdb после успешного создания объектов базы данных появилось следующее сообщение:

Никаких приспособлений не найдено

Затем я попытался вручную загрузить приспособления, используя команду loaddata:

./manage.py loaddata 0100_foobar.yml
Problem installing fixture '0100_foobar': yml is not a known serialization 

Является ли документация, приведенная по ссылке выше, неверной?, или мне нужно установить модуль, чтобы django мог использовать YML?

Кстати, файлы YML анализируются корректно и были проверены на корректность (я успешно использовал их в другом проекте) - так что проблема не в этом

[Править]

Я установил PyYAML и переименовал свои файлы fixtures в соответствии с инструкциями Manoj.Я могу продвинуться немного дальше по линии, но я все еще сталкиваюсь с проблемами (кстати, я использую PyYAML 3.0.9).

Вот модель в моем проекте ORM (т. е.{приложение}/model.py):

class Currency(models.Model):
    short_name = models.CharField(max_length=3, db_index=True, unique=True, null=False) # ISO Code
    long_name = models.CharField(max_length=64, db_index=True, unique=True, null=False)
    spot_settle = models.IntegerField(null=False, default=0)
    rounding = models.IntegerField(null=False, default=2)

Вот файл YAML, который я импортирую:

Currency:    
  currency_aud : { short_name: AUD , long_name: Australia - Dollars , spot_settle: 0, rounding: 2 }    
  currency_cad : { short_name: CAD , long_name: Canada - Dollars , spot_settle: 0, rounding: 2 }    
  currency_eur : { short_name: EUR , long_name: Euro Member Countries - Euro , spot_settle: 0, rounding: 2 }    
  currency_gbp : { short_name: GBP , long_name: United Kingdom - Pounds , spot_settle: 0, rounding: 2 }    
  currency_jpy : { short_name: JPY , long_name: Japan - Yen , spot_settle: 0, rounding: 2 }    
  currency_usd : { short_name: USD , long_name: United States Of America - Dollars , spot_settle: 0, rounding: 2 }    
  currency_zar : { short_name: ZAR , long_name: South Africa - Rand, spot_settle: 0, rounding: 2 }    
  currency_hkd : { short_name: HKD , long_name: Hong Kong Dollar, spot_settle: 0, rounding: 2 }    
  currency_nzd : { short_name: NZD , long_name: New Zealand Dollar, spot_settle: 0, rounding: 2 }    
  currency_sgd : { short_name: SGD , long_name: Singapore Dollar, spot_settle: 0, rounding: 2 }    
  currency_dkk : { short_name: DKK , long_name: Danish Krone, spot_settle: 0, rounding: 2 }    
  currency_sek : { short_name: SEK , long_name: Swedish Krona, spot_settle: 0, rounding: 2 }    
  currency_chf : { short_name: CHF , long_name: Swiss Franc, spot_settle: 0, rounding: 2 }

Вот трассировка стека при запуске./manage.py loaddata myapp/fixtures/currencies.yaml

me@somebox:~/work/demo/myproj$ ./manage.py loaddata reference/fixtures/0100_currency.yaml 
Installing yaml fixture 'reference/fixtures/0100_currency' from absolute path.
Problem installing fixture 'reference/fixtures/0100_currency.yaml': Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/commands/loaddata.py", line 165, in handle
    for obj in objects:
  File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/pyyaml.py", line 57, in Deserializer
    for obj in PythonDeserializer(yaml.load(stream), **options):
  File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/python.py", line 84, in Deserializer
    Model = _get_model(d["model"])
TypeError: string indices must be integers, not str
Это было полезно?

Решение

Я попытался воспроизвести вашу проблему в одном из своих проектов.Очевидно loaddata ожидает, что расширение файла в соответствии с форматом сериализации.В вашем случае вам следует переименовать свой файл в 0100_foobar.yaml (обратите внимание на новое расширение).

Местные тесты показали, что моя гипотеза верна.

PS:Сериализация YAML требует PyYAML библиотека.Если вы еще этого не сделали, установите Пиямл.

Обновить

Я скопировал операционную модель в один из своих проектов.Когда я попытался загрузить образец YAML, предоставленный OP as-is, я получил то же самое ошибка.

После этого я добавил некоторые данные с помощью приложения admin и использовал django.core.serializers.serialize чтобы выгрузить данные в формате YAML.

from django.core.serializers import serialize
from app.models import Currency
print serializers.serialize("yaml", Currency.objects.all())

Результат, который я получил, значительно отличался от того, что опубликовал OP.Смотрите ниже.Я добавил три экземпляра для модели, и они появляются.

- fields: {long_name: Australia - Dollars, rounding: 2, short_name: AUD, spot_settle: 0}
  model: app.currency
  pk: 1
- fields: {long_name: Canada - Dollars, rounding: 2, short_name: CAD, spot_settle: 0}
  model: app.currency
  pk: 2
- fields: {long_name: Euro Member Countries - Euro, rounding: 2, short_name: EUR,
    spot_settle: 0}
  model: app.currency
  pk: 3

Я смог загрузить эти данные обратно без каких-либо проблем.

Учитывая вышесказанное, я подозреваю, что с файлом OP YAML что-то не так.@skyeagle, ты можешь попробовать демпинг существующие данные и тогда попробовать загрузить дамп обратно?

Другие советы

Для таких, как я, кто просто упрям и действительно, по-настоящему, хочет использовать файлы с .yml расширение, вы можете зарегистрировать сериализатор при запуске, чтобы сделать loaddata распознать файл приспособления:

from django.apps import AppConfig
from django.core.serializers import register_serializer


class MyAppConfig(AppConfig):
    name = 'my_app_name'
    label = 'my_app_label'
    verbose_name = 'this is my really cool app'

    def ready(self):
        register_serializer('yml', 'django.core.serializers.pyyaml')

Призыв к register_serializer зарегистрирует yml как признанное расширение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top