【发布时间】:2015-09-04 19:12:32
【问题描述】:
我正在使用 Python 2.7、DRF 3.1.3、Django 1.4.21(我知道它很旧,但它是一个大型代码库,有一天我们会迁移)。实际的商业案例比这更复杂,这里是简化版。
我有一个模型:
class Person(models.Model):
foo = models.CharField(max_length=2, blank=True, null=True)
在 REST API 上,我想公开两个字段,它们都是从 foo 派生的。这两个字段都应该是可写的,并且当我写入时,这两个字段都会以某种方式设置 foo 字段。 尝试 1:不幸的是 bar 是只读的
class PersonSerializer(serializers.ModelSerializer):
bar = serializers.SerializerMethodField()
class Meta:
model = Person
fields = ('id', 'foo', 'bar')
def get_bar(self, obj):
return get_bar(obj.foo) # not relevant now what get_bar does
尝试 2:尝试以某种方式伪造字段
class PlaceholderCharField(serializers.CharField):
def to_representation(self, obj):
pass
def to_internal_value(self, data):
pass
class PersonSerializer(serializers.ModelSerializer):
bar = PlaceholderCharField()
class Meta:
model = Person
fields = ('id', 'foo', 'bar')
def to_representation(self, instance):
data = super(PersonSerializer, self).to_representation(instance)
data['bar'] = get_bar(instance.foo)
return data
def to_internal_value(self, data):
instance = super(PersonSerializer, self).to_internal_value(data)
if data.has_key('bar') and not data.has_key('foo'):
instance.foo = get_foo(data['bar']) if data['bar'] else None
return instance
后一个错误显然是抱怨Person 模型没有 bar 字段。这是真的。如何解决这个问题呢?我可以在序列化程序的to_representation 和to_internal_value 中处理设置/获取foo 和bar。我只想在DRF 中指定一个字段,该字段仅存在于REST API 端,并且在模型端没有关联的字段。我可以处理转换。并且该字段应该是可读写的,否则我可以用SerializerMethodField 解决它。
【问题讨论】:
标签: python django rest django-rest-framework