Добавить поле в сериализатор в зависимости от другого поля: django

#python #django #django-rest-framework #django-serializer

#python #django #django-rest-framework #django-сериализатор

Вопрос:

У меня есть 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')
  

В этом сериализаторе я хочу добавить поле с именем, cancel_reason которое следует добавлять только в том случае, если значение 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

Пожалуйста, предложите решение или альтернативу SerializerMethodField для этого случая использования.. Большое спасибо!!

Ответ №1:

Вы могли бы сделать что-то вроде

 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
  

как упоминалось здесь о том, как добавлять динамические поля в сериализатор

Комментарии:

1. Спасибо, это полезно. Хотя добавление self.fields[‘cancel_reason’] будет работать только в функции инициализации , поскольку значения полей не проверяются после инициализации. Работает после этого обновления!