هل جانغو يسيء إلى YML؟لا يقوم django بتحميل ملف YML الخاص بالتركيبات (yml ليس تسلسلًا معروفًا)

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

سؤال

لقد نجحت في إنشاء مشروع جانغو الأول الخاص بي.

لدي تطبيقان في مشروعي foo و foobar.

لقد قمت بإنشاء مجلد باسم "التركيبات" في كل مجلد من مجلدات التطبيق.لم أقم بتحديد دليل التركيبات في ملف settings.yml الخاص بي، لذلك (وفقا للمستندات)، يجب أن يبحث Django في مجلد {app}/fixtures الخاص بي.

في المجلد {app}/fixtures، لدي العديد من ملفات YML.لقد قمت بتقسيم البيانات الأولية للوحدات المختلفة إلى ملفات YML منفصلة، ​​مع التأكد من عدم وجود تبعيات للملفات المتقاطعة (على سبيل المثال.جميع النماذج ذات الصلة موجودة في نفس ملف YML والأسلاف موجودة في الملف قبل النماذج التي تستخدمها).

ومع ذلك، عندما أقوم بتشغيل./manage.py syncdb بعد إنشاء كائنات قاعدة البيانات بنجاح، ظهرت الرسالة التالية:

لم يتم العثور على تركيبات

ثم حاولت بعد ذلك تحميل التركيبات يدويًا باستخدام أمر التحميل:

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

هل الوثائق الواردة في الرابط أعلاه خاطئة؟ أم أنني بحاجة إلى تثبيت وحدة حتى يتمكن Django من التعامل مع 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 }

إليك تتبع المكدس عندما أقوم بتشغيل ./manage.pyloaddata myapp/fixtures/curreency.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 (لاحظ الامتداد الجديد).

وأظهرت الاختبارات المحلية أن فرضيتي كانت صحيحة.

ملاحظة:يتطلب تسلسل YAML PyYAML مكتبة.إذا لم تقم بذلك بالفعل، قم بتثبيت بييامل.

تحديث

لقد قمت بنسخ نموذج OP إلى أحد مشاريعي.عندما حاولت تحميل نموذج YAML المقدم من OP كما هو، حصلت على ملف 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

لقد تمكنت من تحميل هذه البيانات مرة أخرى دون أي مشكلة.

بالنظر إلى ما سبق، أظن أن هناك خطأ ما في ملف YAML الخاص بـ OP.@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