我已经成功创建了我的第一个django项目。
我的项目foo和foobar中有两个应用程序。
我在每个app文件夹中创建了一个名为'fixtures'的文件夹。我没有在settings.yml中指定一个fixtures目录,所以(according to the docs),django应该在我的{app} / fixtures文件夹中查找。
在{app} / fixtures文件夹中,我有几个YML文件。我已将各个模块的初始数据拆分为单独的YML文件,确保没有跨文件依赖关系(即所有相关模型都在同一个YML文件中,并且在使用它们的模型之前,文件中会出现祖先)。
但是,在成功创建db对象后运行./manage.py syncdb时,会出现以下消息:
找不到任何灯具
然后我尝试使用loaddata命令手动加载灯具:
./manage.py loaddata 0100_foobar.yml
Problem installing fixture '0100_foobar': yml is not a known serialization
上面链接中给出的文档是错误的吗?或者我是否需要安装模块才能让django解决YML?
顺便说一下,YML文件正确解析并且已经检查了它的正确性(我在另一个项目中成功使用它们) - 所以这不是问题[编辑]
我已按照Manoj的说明安装了PyYaml并重命名了我的灯具文件。我能够进一步下线,但我仍然遇到问题(顺便说一下,我正在使用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 }
这是我运行时的堆栈跟踪./manage.py loaddata myapp / fixtures / currency.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
答案 0 :(得分:8)
我试图在我的一个项目中重现您的问题。显然loaddata
期望文件的 扩展名 与序列化格式相匹配。在您的情况下,您应该将文件重命名为0100_foobar.yaml
(请注意新的扩展名)。
本地测试显示我的假设是正确的。
PS :YAML序列化需要PyYAML
库。如果您还没有,请安装PyYAML。
<强>更新强>
我将OP的模型复制到我的一个项目中。当我试图按原样加载OP给出的样本YAML时,我得到了相同的错误。
之后我使用admin app添加了一些数据,并使用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,您可以尝试转储现有数据,然后尝试加载转储吗?
答案 1 :(得分:1)
对于像我这样顽固且真的,真的,想要使用.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
注册为已认可的扩展名。