gpt4 book ai didi

python - DRF 在 REST API 上的两个单独的读写字段中公开模型字段

转载 作者:行者123 更新时间:2023-11-28 22:41:37 26 4
gpt4 key购买 nike

我正在使用 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_representationto_internal_value 中设置/获取 foo 和 bar。我只想在 DRF 中指定一个字段,该字段仅存在于 REST API 端,并且在模型端没有关联的字段。我可以处理转换。那个字段应该是可读写的,否则我可以用 SerializerMethodField 来解决它。

最佳答案

稍微调整一下您的第一次尝试,您就可以为该字段设置别名,没问题:

class PersonSerializer(serializers.ModelSerializer):
# vvvvvvvvv
bar = serializers.CharField(
source='foo', required=False
)# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

class Meta:
model = Person
fields = ('id', 'foo', 'bar')

我仍在使用 DRF 2.4.4 以获得更好的嵌套、多对象嵌套序列化程序支持,但我一直使用该方法为 URL 及其关联对象设置别名,以处理 Angular JS 比较对象的方式它的一些控件。例如

class SensorSerializer(serializers.HyperlinkedModelSerializer):
location_obj = SensorLocationSerializer(source='location',read_only=True,required=False)
class Meta:
model = Sensor
fields = ('url', 'id', 'name', 'serial_number', 'location',
'location_obj', 'active')

关于python - DRF 在 REST API 上的两个单独的读写字段中公开模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32405069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com