मेरे पास मेरे मॉडलसेरियलाइज़र में एक फ़ील्ड है जिसे मैंने फ़ील्ड के व्यवहार को संशोधित करने के लिए 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
Bee Lance 4 अगस्त 2020, 09:50

1 उत्तर

सबसे बढ़िया उत्तर
  1. अद्यतन और बनाने के लिए आपको विभिन्न धारावाहिकों का उपयोग करने की आवश्यकता है। यह धारावाहिक केवल पाने के लिए काम करता है।

  2. या, आप एक कस्टम फ़ील्ड बना सकते हैं। Django Rest Framework SerializerMethodField को कैसे अपडेट करें

  3. या, अन्य सरल हुक हो सकते हैं। यदि 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
...
1
Sagar Adhikari 5 अगस्त 2020, 12:55