使用 django-rest-framework 使用 python 关键字序列化 JSON

Serialize JSON with a python keyword using the django-rest-framework

我有一个 Django 应用程序(使用 django-rest-framework)需要使用 python 关键字“导入”作为字段之一来序列化和反序列化 JSON 有效负载。为了防止模型中的冲突,我可以调用字段 import_flag 并使用 ModelSerializer 中的 source 选项。

models.py

class MyModel(model.Model):
    import_flag = models.BooleanField(verbose_name='Import')

但是(出于显而易见的原因)我不能使用 import 关键字来创建一个名为“import”的 JSON 字段。

serializers.py

    class MyModelSerializer(serializer.ModelSerializer):
        import = serializers.BooleanField(source='import_flag')
        
        def Meta:
            model = MyModel

这个字段存在于 JSON 我从第三方的 RESTful API 消费,我也需要序列化它并发回给同一个第三方.

Django-rest-framework ModelSerializer class 是否有类似 destination 的选项?我一直无法在文档中找到任何内容。

您可以利用 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_valueto_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