我有一个父对象和一对一相关的子模型,我想在父表示(read only
)中渲染子平面的字段。目前,我已经通过自定义to_representation
实现了这一点,但这似乎非常复杂,我想知道是否有更简单的方法来实现这一点。
由于我的相关模型是通过属性连接的,因此更加复杂。
所以这是具体的例子: 默认情况下,相关对象将呈现为:
{
parent_name:'Bob',
child:{
name:'Alice'
}
}
这就是我想要的,目前我的to_representation
:
{
parent_name:'Bob',
child_name:'Alice'
}
我的模特看起来像这样:
class ChildModel(models.Model):
name = models.CharField(max_length=100, null=True)
class ParentModel(models.Model):
name = models.CharField(max_length=100, null=True)
_child = models.ForeignKey('ChildModel', null=True)
@property
def child(self):
return self._most_recent_status
@name.setter
def child(self, value):
self._child = value
以下是我的序列化程序:
class FlatChildField(serializers.RelatedField):
def to_representation(self, value):
return value.name
class FlatParentSerializer(serializers.ModelSerializer):
parent_name = serializers.CharField(source='name', read_only=True)
child_name = FlatChildField(source='_child', read_only=True)
class Meta:
model = Parent
fields = ('name', 'child_name')
对于更简单的解决方案来获得相关模型的平面表示,我将不胜感激。
为了完整起见,我很想知道是否有一个更简单的“正常”相关模型解决方案(即不是属性模型字段)。我正在寻找相当于related_model__field
的django模型查询语法,但我找不到。 django rest框架是否存在?
非常感谢
答案 0 :(得分:15)
最简单的方法是使用source:
class FlatParentSerializer(serializers.ModelSerializer):
parent_name = serializers.CharField(source='name', read_only=True)
child_name = serializers.CharField(source='_child.name', read_only=True)
class Meta:
model = Parent
fields = ('name', 'child_name')
答案 1 :(得分:4)
你可以使用SerializerMethodField,它可以为你节省很多工作,而且它非常简洁明了:
class FlatParentSerializer(serializers.ModelSerializer):
parent_name = serializers.CharField(source='name', read_only=True)
child_name = serializers.SerializerMethodField('get_child_name')
class Meta:
model = Parent
fields = ('name', 'child_name')
def get_child_name(self, obj):
return obj._child.name