2010-10-07 5 views
5

मैंने सफलतापूर्वक अपना पहला django प्रोजेक्ट बनाया है।क्या django grok yML करता है? django फिक्स्चर लोड नहीं कर रहा है YML फ़ाइल (yml एक ज्ञात क्रमिकरण नहीं है)

मेरे पास मेरे प्रोजेक्ट foo और foobar में दो ऐप्स हैं।

मैंने प्रत्येक ऐप फ़ोल्डर्स में 'फिक्स्चर' नामक फ़ोल्डर बनाया है। मैंने अपनी सेटिंग्स.इसीएल में एक फिक्स्चर निर्देशिका निर्दिष्ट नहीं की है, इसलिए (according to the docs), django को मेरे {app}/fixtures फ़ोल्डर में देखना चाहिए।

{app}/fixtures फ़ोल्डर में, मेरे पास कई YML फ़ाइलें हैं। मैंने विभिन्न मॉड्यूल के लिए प्रारंभिक डेटा को अलग-अलग वाईएमएल फाइलों में विभाजित कर दिया है, यह सुनिश्चित कर लें कि कोई क्रॉस फ़ाइल निर्भरता नहीं है (यानी सभी संबंधित मॉडल एक ही वाईएमएल फ़ाइल में हैं और पूर्वजों को उन मॉडलों से पहले फ़ाइल में होता है)।

नहीं जुड़नार पाया

मैं तो मैन्युअल जुड़नार लोड करने का प्रयास:

हालांकि, जब मैं syncdb run./manage.py के बाद डाटाबेस वस्तुओं सफलतापूर्वक निर्मित किए गए, वहाँ निम्न संदेश था

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

प्रलेखन गलत ऊपर के लिंक में दी गई है ?, या मैं Django YML grok सकें, इसके लिए एक मॉड्यूल स्थापित करने की आवश्यकता है: loaddata कमांड का उपयोग करके?

Btw, YML फ़ाइलों को सही ढंग से पार्स और (मैं उन्हें एक अन्य परियोजना में सफलतापूर्वक इस्तेमाल किया) शुद्धता के लिए जाँच की गई है - ताकि समस्या नहीं है

[संपादित करें]

मैं PyYaml स्थापित किया है और मनोज के निर्देशों के अनुसार मेरी फिक्स्चर फाइलों का नाम बदल दिया। मैं लाइन को थोड़ा और नीचे पाने में सक्षम हूं, लेकिन मुझे अभी भी समस्याएं आ रही हैं (बीटीडब्लू, मैं पाययामल 3.0.9 का उपयोग कर रहा हूं)।

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 फ़ाइल मैं आयात करने हूं:

यहाँ मेरी परियोजना ORM (यानी {एप्लिकेशन} /model.py) में मॉडल है

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/फिक्स्चर/currencies.yaml

[email protected]:~/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

मैंने इसे बंद करने के लिए वोट दिया है। उम्मीद है कि अन्य सहमत होंगे और इसे हटा देंगे। –

+0

धन्यवाद मनोज। मैंने सोचा कि मेरे पास जवाब था, लेकिन यह पता चला कि मैं गलत था, इसलिए मैंने फिर से सवाल फिर से सबमिट कर दिया है, मेरे नए निष्कर्षों को प्रतिबिंबित करने के लिए थोड़ा संशोधित – skyeagle

+0

ओह। दुर्भाग्य से मैं अपना वोट वापस नहीं ले सकता। –

उत्तर

7

मैं अपने प्रोजेक्ट में से एक में आपकी समस्या को पुन: पेश करने की कोशिश की चलाने रों। स्पष्ट रूप से loaddata धारावाहिक प्रारूप से मेल खाने के लिए फ़ाइल के एक्सटेंशन की अपेक्षा करता है। आपके मामले में आपको अपनी फ़ाइल का नाम बदलकर 0100_foobar.yaml (नया एक्सटेंशन नोट करें)।

स्थानीय परीक्षणों से पता चला कि मेरी परिकल्पना सही थी।

पुनश्च: YAML क्रमबद्धता PyYAML पुस्तकालय की आवश्यकता है। यदि आपके पास पहले से नहीं है, तो PyYAML इंस्टॉल करें।

अद्यतन

मैं अपनी परियोजनाओं में से एक के लिए ओ पी के मॉडल की नकल की। जब मैंने ओपी द्वारा दिए गए नमूना YAML को लोड करने का प्रयास किया, तो मुझे समान त्रुटि मिली।

इसके बाद मैंने व्यवस्थापक ऐप का उपयोग करके कुछ डेटा जोड़ा और YAML प्रारूप में डेटा डंप करने के लिए django.core.serializers.serialize का उपयोग किया।

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

परिणाम जो मैंने ओपी पोस्ट किए से काफी अलग देखा। निचे देखो। मैंने मॉडल के लिए तीन उदाहरण जोड़े और वे दिखाए जा रहे हैं।

- 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 

मैं बिना किसी परेशानी के इस डेटा को वापस लोड करने में सक्षम था।

उपरोक्त को देखते हुए, मुझे संदेह है कि ओपी की वाईएएमएल फ़ाइल में कुछ गड़बड़ है। @skyeagle, क्या आप डंपिंग मौजूदा डेटा और पर डंप को वापस लोड करने का प्रयास कर सकते हैं?

+0

उत्तर के लिए धन्यवाद - यह मुझे फ़ाइल नाम का पता लगाने में लंबा समय लगेगा विस्तार परिवर्तन आवश्यक है। आपकी सलाह का पालन करने के बाद भी मुझे समस्याएं आ रही हैं। मैंने नए प्रश्नों को प्रतिबिंबित करने के लिए अपने प्रश्न को संशोधित किया है। क्या मेरी वाईएमएल फाइल में कुछ गड़बड़ है? यह एक और परियोजना में ठीक काम करता है ... – skyeagle

+0

जासूस काम के लिए धन्यवाद। मुझे लगता है कि मैं इस बिंदु से मेरी समस्या को ठीक करने में सक्षम हो जाऊंगा। मुझे उड़ान पकड़ने के लिए डैश करना पड़ा है। मैं अब आपका जवाब स्वीकार करूंगा, और मैं इसे आज के दिन में काम करने की कोशिश करूंगा। – skyeagle

+0

मुझे PyYAML याद आ रही थी; धन्यवाद। Https://docs.djangoproject.com/en/1.6/topics/serialization/#serialization-formats देखें। – Seth

1

मेरे जैसे किसी को भी जो सिर्फ जिद्दी है और सच में, सच, एक .yml विस्तार के साथ फ़ाइलों का उपयोग करना चाहता है, तो आप स्टार्ट-अप पर serializer रजिस्टर 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 एक मान्यता प्राप्त विस्तार के रूप में पंजीकृत होगा।

संबंधित मुद्दे