Django

2010-09-20 5 views
34

में विदेशी कुंजी ऑब्जेक्ट्स को सीरियलाइज करना मैं फ्लैग और एंड्रॉइड ऐप्स दोनों के साथ उपयोग करने के लिए Django में कुछ रीस्टफुल सेवाओं को विकसित करने पर काम कर रहा हूं।Django

सेवा इंटरफ़ेस का विकास करना काफी आसान रहा है, लेकिन मैं उन वस्तुओं को क्रमबद्ध करने के साथ एक समस्या में भाग रहा हूं जिनके पास विदेशी कुंजी है और कई रिश्ते हैं।

class Artifact(models.Model): 
    name    = models.CharField(max_length = 255) 
    year_of_origin  = models.IntegerField(max_length = 4, blank = True, null = True) 
    object_type   = models.ForeignKey(ObjectType, blank = True, null = True) 
    individual   = models.ForeignKey(Individual, blank = True, null = True) 
    notes    = models.TextField(blank = True, null = True) 

तब मैं, इस तरह इस मॉडल पर एक प्रश्न प्रदर्शन करेंगे select_related() का उपयोग कर, यह सुनिश्चित करें कि विदेशी कुंजी रिश्तों का पालन कर रहे होने के लिए:

मैं इस तरह एक मॉडल है

artifact = Artifact.objects.select_related().get(pk=pk) 

एक बार मेरे पास ऑब्जेक्ट हो जाने पर, मैं इसे क्रमबद्ध करता हूं, और उसे वापस अपने दृश्य में पास करता हूं:

serializers.serialize("json", [ artifact ]) 

यह वही है जो मैं वापस प्राप्त करता हूं, ध्यान दें कि विदेशी कुंजी (object_type और व्यक्तिगत) सिर्फ आईडी से संबंधित वस्तुओं के लिए हैं।

[ 
     { 
      pk: 1 
      model: "artifacts.artifact" 
      fields: { 
       year_of_origin: 2010 
       name: "Dummy Title" 
       notes: "" 
       object_type: 1 
       individual: 1 
      } 
     } 
] 

यह महान है, लेकिन क्या मैं जब select_related() प्रयोग करने के लिए उम्मीद थी कि यह स्वचालित रूप से विदेशी कुंजी क्षेत्रों संबंधित वस्तु के साथ ही नहीं, वस्तु की आईडी को पॉप्युलेट होता था।

मुझे हाल ही में Django में परिवर्तित किया गया है, लेकिन केकपीएचपी के साथ एक उचित समय में विकसित किया गया है।

मुझे केक ओआरएम के बारे में वास्तव में क्या पसंद आया था कि यह रिश्ते का पालन करेगा और डिफ़ॉल्ट रूप से नेस्टेड ऑब्जेक्ट्स बनायेगा, जब आप अपनी क्वेरी को कॉल करते समय रिश्तों को अनइंड करने की क्षमता के साथ।

इसने सेवाओं को सारणी के लिए बहुत आसान बना दिया जिसने मामले के आधार पर किसी भी हस्तक्षेप की आवश्यकता नहीं थी।

मुझे लगता है कि Django डिफ़ॉल्ट रूप से ऐसा नहीं करता है, लेकिन क्या किसी ऑब्जेक्ट को स्वचालित रूप से क्रमबद्ध करने और इसके सभी संबंधित ऑब्जेक्ट्स को क्रमबद्ध करने का कोई तरीका है? किसी भी सुझाव या पढ़ने की सराहना की जाएगी।

+1

[पीईपी -008] (http://www.python.org/dev/peps/pep-0008) –

उत्तर

24

मुझे एक समान आवश्यकता थी हालांकि भरोसेमंद उद्देश्यों के लिए नहीं। मैं अपने मामले Django Full Serializers में, "पूर्ण" धारावाहिक मॉड्यूल का उपयोग करके मुझे जो कुछ चाहिए, उसे प्राप्त करने में सक्षम था। यह wadofstuff का हिस्सा है और इसे नए बीएसडी लाइसेंस के तहत वितरित किया जाता है।

वाडोफस्टफ यह काफी आसान बनाता है। उदाहरण के लिए आपके मामले में आपको निम्न कार्य करने की आवश्यकता होगी:

सबसे पहले, wadofstuff इंस्टॉल करें।

दूसरा, अपने settings.py फ़ाइल में निम्न सेटिंग को जोड़ने:

SERIALIZATION_MODULES = { 
    'json': 'wadofstuff.django.serializers.json' 
} 

तीसरा, क्रमबद्धता के लिए इस्तेमाल किया कोड के लिए एक मामूली परिवर्तन कर:

artifact = Artifact.objects.select_related().get(pk=pk) 
serializers.serialize("json", [ artifact ], indent = 4, 
    relations = ('object_type', 'individual',)) 

कुंजी परिवर्तन relations कीवर्ड पैरामीटर है । एकमात्र (मामूली) गॉचा संबंधित संबंधों के नामों का संबंध बनाने वाले फ़ील्ड के नाम का उपयोग करना है।

चेतावनी

documentation से:

सामग्री का गुच्छा serializers Django serializers के साथ 100% संगत जब एक मॉडल serializing कर रहे हैं। जब डेटा स्ट्रीम को deserializing Deserializer कक्षा वर्तमान में केवल मानक Django serializers द्वारा लौटाए गए धारावाहिक डेटा के साथ काम करता है।

(जोर जोड़ा)

आशा इस मदद करता है।

0

आप इस टिकट पर अधिक जानकारी प्राप्त कर सकते हैं: गहराई को निर्दिष्ट संबंध का पालन करने से

में गहन क्रमबद्धता की अनुमति दें https://code.djangoproject.com/ticket/4656

10

अद्यतन: असल में मनोज के समाधान थोड़ा पुराना है, सामग्री के serializer का गुच्छा है कुछ समय के लिए अद्यतन नहीं किया गया था और जब मैंने कोशिश की, ऐसा लगता है कि यह अब Django 1.6 का समर्थन नहीं करता है।

हालांकि, Django's official doc here पर एक नज़र डालें। यह अंतर्निहित प्राकृतिक कुंजी का उपयोग करके चारों ओर कुछ रास्ता प्रदान करता है। ऐसा लगता है कि django के अंतर्निर्मित धारावाहिक को प्राकृतिक कुंजी के हिस्से के रूप में ImageField का उपयोग करने में सहायता करने में एक छोटी सी समस्या है। लेकिन इसे आसानी से आपके द्वारा तय किया जा सकता है।

+0

धन्यवाद! मैं प्राकृतिक कुंजी के बारे में भूल गया;) –

+0

@ शेन होचेन, आपका लिंक अब तक पहुंचने योग्य नहीं लगता है। लेकिन मैं आपसे सहमत हूं कि उपर्युक्त समाधान पुराना है। क्या आप लिंक को रीफ्रेश कर सकते हैं? –

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

  • कोई संबंधित समस्या नहीं^_^