2009-10-23 17 views
18

मैं के साथ वस्तुओं का एक समूह serializing कर रहा हूँ:निकालें pk क्षेत्र

json = serializers.serialize("json", objects, fields=('name', 'country')) 

मैं अपने क्षेत्रों की सूची में शामिल नहीं किया है 'पीके', लेकिन उत्पादन JSON प्रत्येक धारावाहिक के साथ एक प्राथमिक कुंजी शामिल वस्तु। मैं नहीं चाहता कि मेरी एपीआई सामान्य लोगों को प्राथमिक कुंजी का पर्दाफाश करे।

आउटपुट जेएसओएन को मंग करने का छोटा, प्राथमिक कुंजी को शामिल करने के लिए serializers.serialze() बताने का सही तरीका क्या है?

+0

@Josh रैह क्या आप अंत किया था इस पर कर रही है? एक टिकट है जो इसके बारे में बात करता है @ http://code.djangoproject.com/ticket/4656 – orokusaki

+0

मैंने सरलजसन को मैन्युअल रूप से –

उत्तर

16

मैं द्वारा 'मैन्युअल' को प्राप्त है कि मैं क्या अंतर्निहित simplejson serializer का उपयोग कर चाहता था इस के आसपास काम कर समाप्त हो गया।

+0

यह ठीक समाधान है यदि आप बस जेसन को कुछ डेटा डंप करना चाहते हैं और एफके के बारे में परवाह नहीं करते हैं। –

+0

@ जोश यदि आपके पास एपीआई में 5 मॉडल का उपयोग करके 28 विधियां हैं तो यह बहुत अधिक कोडिंग है। – orokusaki

+0

मैंने इसका इस्तेमाल किया है। लेकिन जब आप इसे कई विचारों में उपयोग करते हैं तो यह एक परेशानी है। Django के serializers का उपयोग करना सबसे अच्छा है। आखिरी उत्तर में एक संबंधित प्रश्न का एक लिंक है, जो बताता है कि पीके और मॉडल फ़ील्ड्स को उत्पन्न करने वाली वस्तुओं से कैसे हटाया जाए। – Dmitry

0

हम पीके के "स्वच्छता" करने का प्रयास करने में अपना समय बर्बाद नहीं करते हैं। जब हम एक JSON रिकॉर्ड उत्पन्न करते हैं, तो पीके वहां होता है, और यदि उपयोगकर्ता चाहें तो उपयोगकर्ता इसे अनदेखा कर सकता है। वे जानकारी के साथ कुछ भी नहीं कर सकते हैं, तो यह सिर्फ अव्यवस्था है।

हमारी वेब सेवाओं में से कोई भी इंटरफेस किसी को भी हमें पीके प्रदान करने की अनुमति नहीं देता है। हम अन्य क्षेत्रों पर पोस्ट, पुट और डिलीट करते हैं, लेकिन पीके नहीं करते हैं।

एचटीएमएल, हालांकि, पीके के यूआरएल को हर समय दिखाता है। यह लोगों को पृष्ठों को बुकमार्क करने देता है।

from django.utils import simplejson 
json = simplejson.dumps([{'name': o.name, 
          'country': o.country} for o in objects]) 

एक छोटे से अधिक टाइपिंग, लेकिन काम करता है:

+7

पर कॉल करना समाप्त कर दिया है कई कंपनियां मानती हैं कि अनुक्रमिक प्राथमिक कुंजी के भीतर कोई जानकारी नहीं है। यदि आपके पास आपके एक्सेस कंट्रोल लॉक हैं, तो चिंता करने की कोई बात नहीं है, है ना? गलत। कम से कम, खुलासा अनुक्रमिक पहचानकर्ता प्रतियोगियों को आपके विकास का ट्रैक रखने का एक शानदार तरीका प्रदान करता है। क्रमिक आईडी खोजने और विकास अनुमानों को बेचने के आधार पर एक बड़ा उद्योग है। –

+0

अनुक्रमिक आईडी के बजाय यूयूआईडी का उपयोग करके आप समस्या से संपर्क कर सकते हैं ताकि उन्हें सार्वजनिक रूप से उजागर किया जा सके प्रतियोगियों के लिए कोई जानकारी प्रदान नहीं करेगा। –

+0

पीके और मॉडल शामिल होने पर प्रत्येक उपयोगकर्ता को भेजे गए अतिरिक्त पाठ पर भी विचार करें। यह बैंडविड्थ है जो स्पष्ट रूप से सहेजा जा सकता है (विशेष रूप से जब इसे मोबाइल उपयोगकर्ता को भेजना)। – shaond

3

हालांकि यह एक पुराना सवाल है, फिर भी कोई अन्य Google खोज पर इसके साथ आएगा।

दुर्भाग्य से django serializer आपके द्वारा परिभाषित की गई काफी कम अनुकूलन प्रदान करता है। मेरा समाधान, यदि आप जानते हैं कि आप अपने प्रोजेक्ट के लिए बहुत सी सीरियलाइजेशन का उपयोग करेंगे, तो बस डीजेंगो की सीरियलाइजेशन स्टफ को अपनी परियोजना में कॉपी करने और कुछ छोटे बदलाव करने के लिए कॉपी किया गया था। यह आदर्श नहीं है, लेकिन यह नौकरी करता है।

self.xml.startElement("object", { 
     "pk" : smart_unicode(obj._get_pk_val()), 
     "model" : smart_unicode(obj._meta), 
    }) 

"PK" लाइन निकाल रहा है इसे ठीक करना चाहिए: विशेष रूप से, पी के दूर करने के लिए, वहाँ start_object में एक पंक्ति (स्वयं, obj) है। यह कुछ हद तक गंदे हैक है, क्योंकि अगर वे इसे बाद में सुधारते हैं तो आपको अपने विचारों में कुछ बदलावों की आवश्यकता हो सकती है, लेकिन मेरे लिए यह सीमाओं के आस-पास सबसे आसान तरीका था।

उम्मीद है कि यह किसी की मदद करेगा।

7

तुम भी JSON serializer यहां बताए भी पार कर जाते: Override Django Object Serializer to get rid of specified model

from django.core.serializers.json import Serializer, DjangoJSONEncoder 
from django.utils import simplejson 

import logging 

class MySerializer(Serializer): 
    def end_serialization(self): 
     cleaned_objects = [] 

     for obj in self.objects: 
      del obj['pk'] 
      cleaned_objects.append(obj) 

     simplejson.dump(cleaned_objects, self.stream, cls=DjangoJSONEncoder, **self.options) 
+0

धन्यवाद! उस सवाल के जवाब में बहुत मदद मिली! – Dmitry

0

बदसूरत (लेकिन काम) रास्ता:

data_tmp = data.split('{') 
#Gets all the data after fields 
response = "[{"+data_tmp[2].replace("}}","}",1) 
8

क्या जोश किया, लेकिन पीछे की ओर:

data = json.loads(json_string) 

for d in data: 
    del d['pk'] 
    del d['model'] 

data = json.dumps(data) 

इस तरह आपको अधिक फ़ील्ड जोड़ते समय कोड अपडेट करने की चिंता करने की आवश्यकता नहीं है भविष्य।

1

मुझे एक ही समस्या थी, इसलिए मैंने अपना खुद का Serializer बनाया, जो Django से Serializer से विरासत। मुझे केवल फ़ील्ड का डेटा चाहिए, इसलिए मैं get_dump_object विधि को ओवरराइट करता हूं, और पीके फ़ील्ड जोड़ता हूं।

from django.core.serializers.json import Serializer 


class JSONSerializer(Serializer): 
    def get_dump_object(self, obj): 
     self._current[obj._meta.pk.name] = obj._get_pk_val() 
     return self._current 

और फोन:

output = JSONSerializer().serialize(queryset) 
संबंधित मुद्दे