Pranav Totala
Pranav Totala

Reputation: 158

Add a field in Serializer depending on other field : django

I have a seriliazer:

class aaaser(serializers.ModelSerializer):
    client_code = serializers.SerializerMethodField()
    status = serializers.SerializerMethodField()
    
    def get_status(self, obj):
        status_code = obj.status if obj.status else -1
        return status_code

    class Meta:
        model = models.Order
        fields = ('client_code', 'status', 'order_id', 'details')

In this seriliazer i want to add a field with name cancel_reason which should ONLY be added if value of status == 5.

class aaaser(serializers.ModelSerializer):
    client_code = serializers.SerializerMethodField()
    status = serializers.SerializerMethodField()
    
    def get_status(self, obj):
        status_code = obj.status if obj.status else -1
        if status_code == 5:
            # this felt dumb but had to try!
            cancel_reason = serializers.SerializerMethodField()
        return status_code

    def get_cancel_reason(self, obj):
        return "Dummy-reason"

    class Meta:
        model = models.Order
        fields = ('client_code', 'status', 'order_id', 'details')

^This Doesn't work

Please suggest a solution or a alternative to SerializerMethodField for this usecase.. Thanks a lot!!

Upvotes: 1

Views: 1881

Answers (1)

mtshaikh
mtshaikh

Reputation: 678

You could do something like

class aaaser(serializers.ModelSerializer):
    client_code = serializers.SerializerMethodField()
    status = serializers.SerializerMethodField()

    def get_status(self, obj):
        status_code = obj.status if obj.status else -1
        if status_code == 5:
            self.fields['cancel_reason'] = serializers.SerializerMethodField()
        return status_code

as mentioned here on how to add dynamic fields in serializer

Upvotes: 1

Related Questions