Django REST फ्रेमवर्क में फ़ील्ड नाम कैसे बदलें


98

मैं SQL में उपनाम की तरह DRF सीरियल में मॉडल फ़ील्ड नाम को बदलने की कोशिश कर रहा हूं। मैंने विभिन्न तरीकों की कोशिश की है, लेकिन सफल नहीं हो सकता।

models.py

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

    def alias_alternate_name(self):
        return self.alternate_name

serializers.py

class ParkSerializer(serializers.ModelSerializer):

    location = serializers.Field(source='alias_alternate_name')
    #location = serializers.SerializerMethodField(source='alias_alternate_name')

    #alternate_name as location


    class Meta:
        model = Park
        fields = ('id', 'name', 'location')

मैं भी Django क्वेरी में उपनाम जोड़ने की कोशिश की है, लेकिन बदल नहीं सकते।

अपडेट किया गया

यह अपवाद है जो मैं सामना कर रहा हूं

एट्रीब्यूट पर / ViewName / 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता 'फ़ील्ड' नहीं है

मैं यह कैसे कर सकता हूँ?


1
क्या आप serializers.SerializerMethodFieldदृष्टिकोण के सही कार्यान्वयन का उपयोग कर रहे हैं ? मेरा मतलब यह है: serializers.SerializerMethodField('get_location')औरdef get_location(self, obj): ...
erthalion

क्या हम आयात देख सकते हैं serializers.py?
जॉयरिक

प्रश्न को कम कर देगा क्योंकि ओपी नीचे दिए गए बेहतर सवालों के बजाय आंशिक रूप से गलत और भ्रामक उत्तर को स्वीकार करता है ...
NeuronQ

जवाबों:


58

आप उपयोग कर सकते हैं serializers.SerializerMethodField:

यहां मॉडल पार्क है, जिसमें नाम और वैकल्पिक_नाम फ़ील्ड हैं।

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

यहां पार्क मॉडल, पार्क सेरियलाइजर के लिए सीरियल है। यह स्थान के लिए वैकल्पिक_नाम का नाम बदलता है।

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SerializerMethodField('get_alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

    def get_alternate_name(self, obj):
        return obj.alternate_name

इसके अतिरिक्त, आप विशेषता के serializers.CharFieldसाथ उपयोग कर सकते हैं source:

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='other_fields')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

__विदेशी कुंजी को पार करने के लिए Django की धारणा भी काम करती है:

location = serializers.CharField(source='OtherModel__other_fields')

यदि आप एपीआई पर रिटर्न प्रकार बदलना चाहते हैं तो यही सिद्धांत लागू होता है, इसलिए आप serializers.DecimalField(source=...)और अन्य प्रकार के क्षेत्र भी कर सकते हैं ।

हालाँकि यह केवल फ़ील्ड पढ़ने के लिए काम करेगा।


अब यह अपवाद एट्रीब्यूट को फेंक रहा है / ViewName / 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'SerializerMethodField'
शोएब एजाज

1
अनुरोध बनाने और संपादित करने के साथ यह कसरत कैसे होगी?
iankit

1
'पायन के ज़ेन' की लाइन नं 13: "एक होना चाहिए - और अधिमानतः इसे करने के लिए केवल एक - स्पष्ट तरीका।"
--यानीकिट

14
यह स्वीकृत उत्तर नहीं होना चाहिए। नीचे एक देखें, जो मेरे लिखने के समय लगभग 5 गुना है।
cderwin

6
यह एक बुरा उपाय है। sourceनीचे बताए अनुसार कवार का उपयोग करें ।
पैट्रिक

215

धारावाहिक क्षेत्रों और सामान्य रूप से कहे जाने वाले धारावाहिकों में एक बहुत अच्छी विशेषता है, जिसे आप मॉडल क्षेत्र से डेटा का स्रोत निर्दिष्ट कर सकते हैं।

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SomeSerializerField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

जहां serializers.SomeSerializerField serializers.CharField हो सकता है जैसा कि आपका मॉडल सुझाव देता है, लेकिन अन्य क्षेत्रों में से किसी के द्वारा भी। इसके अलावा आप इसके बजाय संबंधपरक क्षेत्र और अन्य धारावाहिकों को रख सकते हैं और यह अभी भी आकर्षण की तरह काम करेगा। यहां तक ​​कि अगर alternate_name दूसरे मॉडल के लिए एक विदेशी क्षेत्र था।

class ParkSerializer(serializers.ModelSerializer):
    locations = AlternateNameSerializer(source='alternate_name', many=true)

    class Meta:
        model = Park
        fields = ('other_fields', 'locations')

class AlternateNameSerializer(serializers.ModelSerialzer):
    class Meta:
        model = SomeModel

यह निर्माण, हटाने और अनुरोधों के संशोधन प्रकार के साथ भी काम करता है। यह प्रभावी रूप से मॉडल में सीरियल नाम और फ़ील्ड नाम में फ़ील्ड नाम की एक मैपिंग पर एक बनाता है।


मैं सहमत था, sourceयह अधिक सामान्य दृष्टिकोण है। लेकिन आप प्रश्न में इसका उपयोग करने के लिए कुछ प्रयास देख सकते हैं, इसलिए यदि आप इस तरह से उत्तर देना चाहते हैं तो आपको यह भी स्पष्ट करना चाहिए कि मूल कोड क्यों काम नहीं कर रहा है, है ना?
13

आपका कोड ठीक काम करेगा .. जब तक अनुरोध सूची और पुनर्प्राप्ति के लिए है
iankit

दोनों उत्तर अधूरे हैं। विदेशी कुंजी के मामले में, इस पद्धति का तात्पर्य है कि एक नया पार्क बनाते समय, आपको अपने POST अनुरोध में पूरे माता-पिता की वस्तु (alternate_name) को एक तानाशाह के रूप में देना होगा, जो कि पागल है क्योंकि मूल वस्तु पहले से मौजूद है। किसी को अपनी आईडी के माध्यम से विदेशी उदाहरण का उल्लेख करने में सक्षम होना चाहिए।
स्टेलियोस

मेरे मामले में (विदेशी कुंजी) मैंने इस समस्या को हल किया locations = serializers.PrimaryKeyRelatedField(source='alternate_name', queryset=AlternateName.objects.all())। जाहिरा तौर पर RelatedFieldभी इस्तेमाल किया जा सकता है।
स्टेलियोस

@chefarov स्रोत = 'new_name' एक सामान्य तर्क है जो आप धारावाहिक क्षेत्रों, संबंधों और अन्य संबंधित धारावाहिकों आदि को दे सकते हैं। यकीन नहीं होता कि आप क्यों कहते हैं कि उत्तर अधूरा है।
--यानीकिट

15

यह लेखन कार्यों के लिए भी काम करेगा

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('id', 'name', 'location')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.