#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’] будет работать только в функции инициализации , поскольку значения полей не проверяются после инициализации. Работает после этого обновления!