Django REST फ्रेमवर्क: ModelSerializer को अतिरिक्त फ़ील्ड जोड़ना




django-rest-framework (4)

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

class FooSerializer(serializers.ModelSerializer):
  my_field = ... # result of some database queries on the input Foo object
  class Meta:
        model = Foo
        fields = ('id', 'name', 'myfield')

ऐसा करने का सही तरीका क्या है? मैं देखता हूं कि आप धारावाहिक को अतिरिक्त "संदर्भ" में पारित कर सकते हैं , एक संदर्भ शब्दकोश में अतिरिक्त फ़ील्ड में पास करने का सही उत्तर है? उस दृष्टिकोण के साथ, मुझे जो फ़ील्ड चाहिए, उसे प्राप्त करने का तर्क सीरियलाइज़र परिभाषा के साथ स्वयं निहित नहीं होगा, जो कि आदर्श है क्योंकि हर धारावाहिक उदाहरण को my_field आवश्यकता my_field । डीआरएफ धारावाहिक दस्तावेज में कहीं और यह says "अतिरिक्त क्षेत्र मॉडल पर किसी भी संपत्ति या कॉल करने योग्य के अनुरूप हो सकते हैं"। क्या अतिरिक्त फ़ील्ड मैं किस बारे में बात कर रहा हूं? क्या मुझे Foo की मॉडल परिभाषा में एक फ़ंक्शन परिभाषित करना चाहिए जो my_field मान देता है, और serializer में मैं my_field को उस कॉल करने योग्य को हुक करता हूं? वह किस तरह का दिखता है?

अग्रिम धन्यवाद, यदि आवश्यक हो तो प्रश्न को स्पष्ट करने में प्रसन्नता हो रही है।


Django Rest Framework के अंतिम संस्करण के साथ, आपको उस फ़ील्ड के नाम के साथ अपने मॉडल में एक विधि बनाने की आवश्यकता है जिसे आप जोड़ना चाहते हैं। @property और source='field' की कोई आवश्यकता नहीं है।

class Foo(models.Model):
    . . .
    def foo(self):
        return 'stuff'
    . . .

class FooSerializer(ModelSerializer):
    foo = serializers.ReadOnlyField()

    class Meta:
        model = Foo
        fields = ('foo',)

आप अपनी मॉडल विधि को संपत्ति में बदल सकते हैं और इस दृष्टिकोण के साथ सीरिएलाइज़र में इसका उपयोग कर सकते हैं।

class Foo(models.Model):
    . . .
    @property
    def my_field(self):
        return stuff
    . . .

class FooSerializer(ModelSerializer):
    my_field = serializers.ReadOnlyField(source='my_field')

    class Meta:
        model = Foo
        fields = ('my_field',)

संपादित करें: बाकी ढांचे के हाल के संस्करणों के साथ (मैंने 3.3.3 की कोशिश की), आपको संपत्ति में बदलने की आवश्यकता नहीं है। मॉडल विधि बस ठीक काम करेगा।


जैसा कि रासायनिक कार्यक्रमकार ने इस टिप्पणी में कहा था, नवीनतम डीआरएफ में आप इसे इस तरह से कर सकते हैं:

class FooSerializer(serializers.ModelSerializer):
    extra_field = serializers.SerializerMethodField()

    def get_extra_field(self, foo_instance):
        return foo_instance.a + foo_instance.b

    class Meta:
        model = Foo
        fields = ('extra_field', ...)

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield


मुझे लगता है कि SerializerMethodField वह है जिसे आप ढूंढ रहे हैं:

class FooSerializer(serializers.ModelSerializer):
  my_field = serializers.SerializerMethodField('is_named_bar')

  def is_named_bar(self, foo):
      return foo.name == "bar" 

  class Meta:
    model = Foo
    fields = ('id', 'name', 'my_field')

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield





django-rest-framework