django喜欢YML吗?django未加载YML文件(YML不是已知的序列化)

django喜欢YML吗?django未加载YML文件(YML不是已知的序列化),django,django-models,yaml,pyyaml,Django,Django Models,Yaml,Pyyaml,我已经成功地创建了我的第一个django项目 我的项目foo和foobar中有两个应用程序 我已经在每个应用程序文件夹中创建了一个名为“fixtures”的文件夹。我没有在my settings.yml中指定fixtures目录,因此()django应该在我的{app}/fixtures文件夹中查找 在{app}/fixtures文件夹中,我有几个YML文件。我已将各个模块的初始数据拆分为单独的YML文件,以确保没有跨文件依赖关系(即,所有相关模型都在同一个YML文件中,并且祖先出现在使用它们的

我已经成功地创建了我的第一个django项目

我的项目foo和foobar中有两个应用程序

我已经在每个应用程序文件夹中创建了一个名为“fixtures”的文件夹。我没有在my settings.yml中指定fixtures目录,因此()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 grok YML

顺便说一句,YML文件解析正确,并且已经过正确性检查(我在另一个项目中成功地使用了它们)——所以这不是问题所在

[编辑]

我已经按照Manoj的指示安装了PyYaml并重命名了我的fixtures文件。我可以再往前走一点,但是我仍然遇到问题(顺便说一句,我使用的是PyYAML3.0.9)

以下是我的项目ORM中的模型(即{app}/Model.py):

以下是我正在导入的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/currences.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\u foobar.yaml
(注意新的扩展名)

当地的测试表明我的假设是正确的

PS:YAML序列化需要
PyYAML
库。如果尚未安装,请安装

更新

我将OP的模型复制到我的一个项目中。当我尝试按原样加载OP提供的示例YAML时,我得到了相同的错误

之后,我使用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
的文件,你可以在启动时注册一个序列化程序,让
加载数据
识别夹具文件:

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\u serializer
yml
注册为可识别的扩展。

我已投票关闭它。希望其他人会同意并删除它。谢谢Manoj。我以为我有答案,但事实证明我错了,所以我再次提交了这个问题,稍作修改以反映我的新发现。不幸的是,我不能撤回我的投票。@manoj:为什么,你这个小……;)呵呵,别担心——希望有人会来提供答案。我一直在做一些研究,看起来我必须先安装PyYaml。还是等着听听这里的蟒蛇吧……如果有什么安慰的话,我已经为你的问题发布了一个经过测试的答案;)谢谢你的回答-我要花很长时间才能弄清楚所需的文件扩展名更改。听了你的建议后,我仍然有问题。我修改了我的问题以反映新的事态。我的YML文件有什么问题吗?在另一个项目中效果很好…谢谢你的侦探工作。我想从现在起我就能解决我的问题了。我得赶紧去赶飞机。我现在就接受你的回答,今天晚些时候我会努力解决的;非常感谢。看见
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')