在Django Rest Framework中指定相关的字符串字段

时间:2019-01-23 11:01:07

标签: python django django-rest-framework

Django 1.11,Django Rest Framework 3.6。

我有2个模型,FooBar

class Foo(models.Model):
    name=models.CharField()
    sex=models.CharField()

class Bar(models.Model):
    type=models.CharField()
    foo=models.ForeignKey(Foo)

在我的serializers.py中,我有:

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = Foo
        fields = ('sex',)

class BarSerializer(serializers.ModelSerializer):
    foo = FooSerializer(many=False)
    class Meta:
        model = Bar
        fields = ('type', 'foo',)

这将生成如下所示的JSON:

{
  "type": "abcdefg",
  "foo": {
    "sex": "male"
  }
}

我真正想要的是使“ foo”字段保持平坦,即:

{
  "type": "abcdefg",
  "foo": "male"
}

一种可能的解决方案是使用StringRelatedField,但这将需要设置__str__模型的Foo方法以返回sex字段,我这样做不想。

2 个答案:

答案 0 :(得分:1)

一种更简单的选择是使用SlugRelatedField,它可以指向任何字段。

class BarSerializer(serializers.ModelSerializer):
    foo = SlugRelatedField(slug_field='sex')
    class Meta:
        model = Bar
        fields = ('type', 'foo',)

答案 1 :(得分:0)

您可以尝试使用SerializerMethodField代替。

class BarSerializer(serializers.ModelSerializer):
    foo = serializers.SerializerMethodField()

    @staticmethod
    def get_foo(item):
        if item.foo:
           return item.foo.sex

    class Meta:
        model = Bar
        fields = ('type', 'foo',)