使用 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_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
我有一个 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_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