我的模型看起来像这样:
class Foo:
name = CharField()
class Bar:
foo = ForeignKey(Foo, related_name='bars')
bar_text = TextField()
我希望Foo的序列化版本看起来像:
{
bars : [
"baz",
"whizz"
]
}
,而不是显示每个栏的id
,显示' bar_text'反而在内场。
我想我已经知道如何正常地做到这一点,即如果我们在每个Foo'下面都有一个bar
属性。而不是列表:
class FooSerializer(models.ModelSerializer):
bar = serializers.TextField(source='bar.bar_text')
但我不确定如何在使用'栏时执行相同的覆盖。列表,似乎找不到任何明显的东西!
编辑:我忘了提及 - 我认为我可以通过覆盖restore_object
功能来做到这一点,但是如果有更简洁的方式,那么我全都是耳朵。
答案 0 :(得分:1)
几乎适用于我的解决方案是使用bars
覆盖FooSerializer
上的BarSerializer
属性:
class FooSerializer(models.ModelSerializer):
bars = BarSerializer(many=True)
但是,这在序列化时给出了以下内容:
{
bars: [
{
'bar_text' : 'baz',
},
{
'bar_text' : 'whizz'
}
]
}
哪个好,但我真的想要一个bar_text
而不是键/值对的列表。更重要的是,如果我向Bar
添加更多不希望被序列化为Foo
的字段,我无法控制此处显示的字段与{{{{1}的纯序列化1}}。如果我没有得到更好的解决方案,我很快就会接受。
答案 1 :(得分:1)
听起来你正在寻找SlugRelatedField
而不是嵌套的序列化器。
class FooSerializer(models.ModelSerializer):
bars = serializers.SlugRelatedField(slug_field='bar_text')