मेरे पास मेरे मॉडलसेरियलाइज़र में एक फ़ील्ड है जिसे मैंने फ़ील्ड के व्यवहार को संशोधित करने के लिए SerializerMethodField के रूप में सेट किया है। मैं पहले डेटा अपडेट कर सकता था, अब मैं नहीं कर सकता। इसे कैसे हल किया जा सकता है?
प्रारंभ में, SerializerMethodField का उपयोग किए बिना, मुझे इस तरह का डेटा मिला:
{
...
"members": [2,3],
...
}
लेकिन मैंने डेटा को संशोधित करने के लिए SerializerMethodField जोड़ा, फिर अपडेट ने काम करना बंद कर दिया।
models.py
# Create your models here.
class Company(models.Model):
members = ArrayField(models.IntegerField(blank=True), blank=True)
...
serializers.py
class AccountSerializer(serializers.ModelSerializer):
user=serializers.StringRelatedField(read_only=False)
class Meta:
model=Account
fields='__all__'
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class CompanySerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=False)
members = serializers.SerializerMethodField()
class Meta:
model = Company
fields = '__all__' #('id', 'name', 'description', 'date_created', 'user', 'status', 'theme', 'members')
def get_members(self, obj):
accounts = Account.objects.filter(id__in=obj.members)
return AccountSerializer(accounts, many=True).data
...
1 उत्तर
अद्यतन और बनाने के लिए आपको विभिन्न धारावाहिकों का उपयोग करने की आवश्यकता है। यह धारावाहिक केवल पाने के लिए काम करता है।
या, आप एक कस्टम फ़ील्ड बना सकते हैं। Django Rest Framework SerializerMethodField को कैसे अपडेट करें
या, अन्य सरल हुक हो सकते हैं। यदि
members
को संशोधित करने से पहले 'बनाएं' और 'अपडेट' ने काम किया है, तो आप अनुरोधों को बनाने और अपडेट करने के लिए सब कुछ डिफ़ॉल्ट रूप से प्राप्त करने के लिए अनुसरण कर सकते हैं।
__init__
विधि को ओवरराइड करें। .
class CompanySerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
try:
if self.context['request'].method in ['GET']:
self.fields['members'] = SerializerMethodField()
except KeyError:
pass
class Meta:
model = Company
fields = '__all__' #('id', 'name', 'description', 'date_created', 'user', 'status', 'theme', 'members')
def get_members(self, obj):
accounts = Account.objects.filter(id__in=obj.members)
return AccountSerializer(accounts, many=True).data
...
- या, आप सदस्य प्राप्त करने के लिए भिन्न फ़ील्ड बना सकते हैं।
class CompanySerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=False)
members_data = SerializerMethodField()
class Meta:
model = Company
fields = ('id', 'name', 'description', 'date_created', 'user', 'status', 'theme', 'members', 'members_data')
def get_members_data(self, obj):
accounts = Account.objects.filter(id__in=obj.members)
return AccountSerializer(accounts, many=True).data
...
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।