मॉडल प्रॉपर्टी का उपयोग करके मॉडल सेरिसेलाइज़र


95

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

models.py:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    slug = models.AutoSlugField(populate_from='name')

    @property
    def ext_link(self):
        return "/".join([settings.EXT_BASE_URL, self.slug])

serializers.py:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

जब संबंधित URL पर जाने की कोशिश कर रहा हूं, तो मुझे ext_linkसंपत्ति पर एक धारावाहिक अपवाद (KeyError) मिल रहा है।

मैं ext_linkसंपत्ति को कैसे अनुक्रमित कर सकता हूं ?

जवाबों:


134

क्योंकि यह मॉडल क्षेत्र नहीं है, इसलिए इसे स्पष्ट रूप से धारावाहिक वर्ग में जोड़ा जाना चाहिए

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.Field()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

5
एक नोट : मेटा में फ़ील्ड सूची वैकल्पिक है। यदि आप छोड़ देते हैंfields, तो उपरोक्त उदाहरण में, आपकोक्रमबद्ध डेटा मेंसभीMyModelफ़ील्ड प्लसमिलेंगेext_link। और यह वास्तव में जटिल मॉडल के लिए बहुत बढ़िया है! संपादित करें : कम से कम, यह सच हैdjangorestframework==2.3.14
e.thompsy

मेरे लिए, serializers का उपयोग कर। फ़ील ने एक त्रुटि दी। "serializers.ReadOnlyField" काम करता है अगर to_repretation को परिभाषित नहीं किया गया है और दृश्य केवल-पढ़ने के लिए है।
शशांक सिंगला

13
मैं 3.3.x का उपयोग कर रहा हूं और केवल खेतों में गुण जोड़ना पर्याप्त नहीं है। मुझे अभी भी ext_link = serializers.eadOnlyField () के माध्यम से स्पष्ट रूप से जोड़ना है।
कर्मोद

4
पायथन 3.5.1 और Django 1.10 पर DRF 3.4.6 का उपयोग करना, खेतों को जोड़ने से ठीक काम करता है।
वैभव मिश्रा

9
नोट: उपयोग करते हुए fields = "__all__"मुझे myfield = serializers.ReadOnlyField()संस्करण Robert.३.
Robert

20

@Robert Townleyटिप्पणी के रूप में , संस्करण के साथ यह काम 3.8.2:

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.ReadOnlyField()

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