Сериализация 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
Вернуться на верх