2010-09-30 11 views
11

मैं मॉडल डेटा लिखने के लिए की जरूरत है (CharField केवल एस) एक फ्लैश फ़ाइल के लिए डेटा शामिल होने की। मैं इसके लिए नया हूं, और प्रक्रिया django में ऐसा करने के लिए मेरे लिए थोड़ा अस्पष्ट है। मैं एक एक्सएमएल फ़ाइल बना रहा हूं, और फिर फ़ाइल में टेक्स्ट डेटा लिख ​​रहा हूं (जैसा कि सीएसवी मॉड्यूल के साथ किया गया है, लेकिन एक्सएमएल के लिए)। के लिए फ्लैश फ़ाइल को पढ़ने के लिए एक बहुत ही सरल xml फ़ाइल, परिणाम यानी चाहिए:किसी XML फ़ाइल में मॉडल डेटा से एक्सएमएल फ़ाइल उत्पन्न

from django.core import serializers 
data = serializers.serialize('xml', myModel.objects.filter(instanceIwantTowrite), fields=('fieldName')) 

2. मैं तो:

<?xml version="1.0" encoding="UTF-8"?> 
<textFields> 
    <textField id="0" text="HELLO WORLD" /> 
    <textField id="1" text="HELLO EARTH" /> 
    ... 
</textFields> 

1. मैं मॉडल से xml डेटा लिखने के लिए एक serializer उपयोग कर रहा हूँ core.files का उपयोग कर फ़ाइल बनाने:

from django.core.files import File  
f = open('/path/to/new/dir/content.xml', 'w') 
myfile = File(f) 

3. लिखें फ़ाइल डेटा और करीब:

myfile.write(data) 

myfile.close() 

यह अब तक काम करता है, हालांकि एक्सएमएल उत्पादन वस्तु "Django-वस्तुओं" आदि के लिए फ़ील्ड मौजूद है, और मैं अगर मैं फ्लैश फ़ाइल के लिए आसानी से ActionScript में इस व्याख्या कर सकते हैं देखने के लिए होगा। मैं csv मॉड्यूल में मैन्युअल रूप से xml फ़ील्ड नामों को परिभाषित करना पसंद करूंगा। जैसा कि मैं django और पायथन के लिए नया हूँ, मैं सोच रहा हूं कि ऐसा करने के लिए एक आसान, आसान तरीका है?

नोट: serializer में मैं क्योंकि मॉडल उदाहरण के लिए get का उपयोग कर मॉडल वस्तुओं पर फिल्टर का उपयोग एक object not iterable त्रुटि देता है। असल में मैं एक उदाहरण प्राप्त करने के लिए इसे दो बार फ़िल्टर करता हूं, ऐसा लगता है कि एक बेहतर तरीका होना चाहिए।

+0

मैं आपके इच्छित XML प्रारूप के बारे में स्पष्ट नहीं हूं। क्या एक 'textField' तत्व डेटाबेस में एक पंक्ति के बराबर है, प्रत्येक एक फ़ील्ड के साथ? यदि ऐसा है तो 'आईडी' संख्या क्या है? यदि नहीं, तो आप पंक्तियों के बीच अंतर कैसे कर रहे हैं? –

+0

इसके अलावा, क्या आपने JSON को क्रमबद्ध प्रारूप के रूप में माना है? निर्माण और उपभोग दोनों के लिए यह बहुत आसान है। –

+0

हां, टेक्स्टफिल्ड डीबी में एक एकल चार्फिल्ड प्रविष्टि होगी (प्रत्येक डीबी प्रविष्टि फ़ील्ड फ़्लैश फ़ाइल में टेक्स्टफील्ड भरने के लिए)। क्षमा करें कि आईडी थोड़ा उलझन में था, विचार यह है कि फ़्लैश फ़ाइल में कई टेक्स्टफील्ड हैं, इसलिए आईडी मॉडल में विभिन्न charFields के अनुरूप है। वे अलग मॉडल charFields होना चाहिए। मैं अब JSON में देख रहा हूं, आम तौर पर मैंने एएस 3 के साथ एक्सएमएल का इस्तेमाल किया है, ऐसा लगता है कि जेएसओएन को एएस 3 लाइब्रेरी आयात की आवश्यकता होगी, और इस ऐप के लिए दुर्भाग्यवश यह विकल्प नहीं है। – HdN8

उत्तर

25

आप यहाँ दो संभव समाधान है:

1.

आप आधार Django एक्सएमएल serializer (django.core.serializers.xml_serializer.Serializer) का विस्तार करने और इसे संशोधित तो यह आपके संरचना में डेटा वापस आ जाएगी कर सकते हैं। फिर आप पूर्व चला सकते हैं।

YourSerializer('xml', myModel.objects.filter(instanceIwantTowrite), fields=('fieldName')) 

और यह आपकी संरचना में डेटा आउटपुट करेगा।

2.

सरल समारोह है कि आपके डेटा संरचना के साथ टेम्पलेट प्रस्तुत करना और अपने स्वरूप में xml डेटा देगी लिखें:

अजगर कोड

from django.template.loader import render_to_string 

def my_serialize(query_set): 
    xml = render_to_string('xml_template.xml', {'query_set': query_set}) 

    return xml 

खाका xml_template.xml

<?xml version="1.0" encoding="UTF-8"?> 
<textFields> 
    {% for object in query_set %} 
    <textField id="{{ object.pk }}" text="{{ object.my_field }}" /> 
    {% endfor %} 
</textFields> 
+0

ठीक है, विकल्प 2 इसके इष्टतम समाधान की तरह दिखता है, इसलिए मैं render_to_string और एक पूर्वनिर्धारित टेम्पलेट का उपयोग करके एक्सएमएल संरचना को परिभाषित कर सकता हूं (जो कि मुझे लगता है कि एक टेक्स्ट फ़ाइल भी हो सकती है)। फिर मैं सिर्फ 'xml' के साथ file.write() विधि का उपयोग सामग्री के रूप में करता हूं ... ठीक है, मैं इस विकल्प को लागू करने का प्रयास करूंगा, धन्यवाद! – HdN8

+0

हां, टेम्पलेट एक टेक्स्ट फ़ाइल है। –

+0

शानदार। झगड़े के बिना काम करता है। +1 – Glycerine

1

इस समस्या को हल करने के लिए एक और सामान्य दृष्टिकोण के लिए, आप मॉडल पर एक साधारण बतख पंच का उपयोग करके टेम्पलेट से बच सकते हैं, और ElementTree का उपयोग कर XML पर किसी भी गहरे ऑब्जेक्ट ग्राफ़ को क्रमबद्ध कर सकते हैं।

बंदर पैच/बतख पंच मॉडल अपने मॉडल में:

यहाँ कैसे मैं इसे हल है।py की तरह:

if hasattr(models.Model, "to_element")==False: 
    import xml.etree.ElementTree as ET 
    def to_element(self): 
     ele = ET.Element(self.__class__.__name__) 
     for field in self._meta.fields: 
      ele.attrib[field.attname]=str(getattr(self,field.attname)) 
     return ele 
    models.Model.to_element = to_element 

यह मॉडल Django cruft के बिना जो मॉडल है कि आपके द्वारा देखभाल की खेतों युक्त एक तत्व उदाहरण बनाता है एक विधि कहते हैं।

dealer = Dealer.objects.get(id=dealer_id) 
makes = DealerMake.objects.filter(dealer=dealer) 

root = dealer.to_element() 
for make in makes: 
    root.append(make.to_element()) 

xml = ET.tostring(root) 
print xml 

इस दृष्टिकोण आप विशेषताओं के रूप में सभी Django मॉडल क्षेत्रों के साथ एक अच्छी तरह से स्वरूपित XML दस्तावेज प्राप्त कर सकते हैं के साथ, और एक n स्तर गहरी पदानुक्रम का निर्माण:

फिर, अपने XML दस्तावेज़ के निर्माण के लिए, बस यह करने के । प्रत्येक एक्सएमएल नोड को मॉडल क्लास के समान नाम दिया जाएगा।

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