Сериализация JSON с помощью ключевого слова python с использованием django-rest-framework
У меня есть приложение django (использующее django-rest-framework), которому необходимо сериализовать и десериализовать полезную нагрузку JSON с ключевым словом python "import" в качестве одного из полей. Чтобы предотвратить конфликты в модели, я могу назвать поле import_flag
и использовать опцию source
в ModelSerializer.
models.py
class MyModel(model.Model):
import_flag = models.BooleanField(verbose_name='Import')
Но (по очевидным причинам) я не могу использовать ключевое слово import
как для создания поля JSON с именем "import", например, так.
serializers.py
class MyModelSerializer(serializer.ModelSerializer):
import = serializers.BooleanField(source='import_flag')
def Meta:
model = MyModel
Это поле присутствует в JSON, который я получаю из RESTful API третьей стороны, и мне также необходимо сериализовать его и отправить обратно той же третьей стороне.
Есть ли что-то вроде destination
опции для класса ModelSerializer из Django-rest-framework? Я не смог найти ничего в документации.
Вы можете использовать метод to_representation
для добавления дополнительных полей при обратной сериализации:
def to_representation(self, instance):
attrs = super().to_representation(instance)
attrs['import'] = attrs['import_flag']
...
return attrs
Вы также можете переопределить __init__
вашего сериализатора и попробовать добавить поле import
туда:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['import'] = serializers.BooleanField(source='import_flag')
вы можете сделать это, переопределив to_internal_value
и to_representation
в вашем сериализаторе.
class MyModelSerializer(serializers.ModelSerializer):
def Meta:
model = MyModel
fields = ...
def to_internal_value(self, data):
instance = super(MyModelSerializer, self).to_internal_value(data)
instance.import_flag = data.get('import')
def to_representation(self, instance):
data = super(MyModelSerializer, self).to_representation(instance)
data['import'] = instance.import_flag