दिलचस्प पोस्ट
सॉर्टिंग टेबल गलत है जब सॉर्ट बटन को एक से अधिक बार दबाया जाए? क्या आप स्विफ्ट में एक्सटेंशन के बीच ओवरराइड कर सकते हैं या नहीं? (कंपाइलर उलझन में लगता है!) सुंदरसूप का उपयोग करके कोई टैग निकालें, लेकिन इसकी सामग्री को रखें आईओएस: एक HTTP पोस्ट अनुरोध कैसे करना है? ग्रैडल और बहु-परियोजना संरचना स्पार्क में संपीड़न से संपूर्ण टेक्स्ट फाइलें पढ़ें गुण फ़ाइल से मान कैसे पढ़ा जाए? वायदा के साथ स्काला में अतुल्यकालिक IO मैं C ++ में एरेज़ का उपयोग कैसे करूं? टाइप-सुरक्षित डाटाबेसिंग में सी # के लिए 'नेमफ' ऑपरेटर की कमी के लिए वैकल्पिक हल? सेलेनियम वेबड्राइवर का उपयोग करके विंडोज़ फाइल अपलोड कैसे करें? '$ (दस्तावेज़) के non-jQuery समतुल्य क्या है .ready ()'? एक wpf लिखने योग्य बिटमैप के लिए एक ड्राइंग कॉन्टैक्ट प्राप्त करना नाम स्ट्रिंग.फ़ॉर्मेट, क्या यह संभव है? आधार वर्ग के <<सूची के लिए व्युत्पन्न वर्ग के <> सूची का कास्टिंग

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

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

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 आवश्यकता होगी अन्यथा डीआरएफ धारावाहिकों के प्रलेखन में यह कहते हैं, "अतिरिक्त फ़ील्ड मॉडल पर किसी संपत्ति या दामयोग्य के अनुरूप हो सकती है"। अतिरिक्त फ़ील्ड क्या मैं इसके बारे में बात कर रहा हूँ? क्या मुझे Foo की मॉडल परिभाषा में एक फ़ंक्शन परिभाषित करनी चाहिए, जो कि my_field मान देता है, और my_field में मैं my_field को उस कॉल करने योग्य हुक कर देता हूं? वह किस तरह का दिखता है?

अग्रिम धन्यवाद, यदि आवश्यक हो तो सवाल को स्पष्ट करने के लिए खुश।

Solutions Collecting From Web of "Django REST फ़्रेमवर्क: अतिरिक्त फ़ील्ड ModelSerializer को जोड़ने"

मुझे लगता है कि 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

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

 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 MyModel(models.Model): ... def model_method(self): return "some_calculated_result" 

आप अपने सीरियलआईज़र को बुलाते हुए पद्धति के परिणाम को इसी तरह जोड़ सकते हैं:

 class MyModelSerializer(serializers.ModelSerializer): model_method_field = serializers.CharField(source='model_method') 

ps चूंकि कस्टम फ़ील्ड वास्तव में आपके मॉडल में कोई फ़ील्ड नहीं है, आप आमतौर पर इसे केवल पढ़ने के लिए ही करना चाहते हैं, जैसे:

 class Meta: model = MyModel read_only_fields = ( 'model_method_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',)