我已经成功创建了我的第一个Django项目。

我的Project Foo和Foobar中有两个应用程序。

我在每个应用程序文件夹中创建了一个名为“固定装置”的文件夹。我尚未在我的设置中指定一个固定目录。根据文档),Django应该在我的{app}/fixtures文件夹中查看。

在{app}/fixtures文件夹中,我有几个YML文件。我已经将各种模块的初始数据分为单独的YML文件,确保没有交叉文件依赖项(即所有相关模型都在同一YML文件中,并且在使用它们之前,祖先出现在文件中)。

但是,当我运行DB对象后,当我运行时。

找不到固定装置

然后,我尝试使用LoadData命令手动加载灯具:

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

上述链接中的文档是否错误?还是我需要安装模块才能使Django grok yml?

顺便说一句,YML文件正确解析并已检查是否正确(我在另一个项目中成功使用了它们) - 这不是问题

编辑

我已经安装了PYYAML,并根据Manoj的说明重命名了我的固定文件文件。我能够进一步了解一些问题,但是我仍然遇到问题(顺便说一句,我正在使用Pyyaml 3.0.9)。

这是我的项目ORM(即{app}/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 }

这是我运行时的堆栈跟踪。

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 图书馆。如果您还没有,请安装 Pyyaml.

更新

我将OP的模型复制到我的一个项目中。当我尝试加载op as-is给出的样本yaml时,我得到了 相同的 错误。

之后,我使用管理应用程序添加了一些数据并使用了 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