使用Django Rest Framework从列表中的对象序列化自定义字段

时间:2016-01-26 01:45:08

标签: python django django-rest-framework

我的模型看起来像这样:

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功能来做到这一点,但是如果有更简洁的方式,那么我全都是耳朵。

2 个答案:

答案 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')