Укажите связанное поле строки в Django Rest Framework - PullRequest
0 голосов
/ 23 января 2019

Django 1.11, Django Rest Framework 3.6.

У меня есть 2 модели, Foo и Bar:

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» было плоским, то есть: * 10101 *

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

Одним из возможных решений было бы использование StringRelatedField , но это повлекло бы за собой установку метода __str__ модели Foo для возврата поля sex, которое мне не нужно.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Более простой альтернативой является использование SlugRelatedField , которое может указывать на любое поле.

class BarSerializer(serializers.ModelSerializer):
    foo = SlugRelatedField(slug_field='sex')
    class Meta:
        model = Bar
        fields = ('type', 'foo',)
0 голосов
/ 23 января 2019

вы можете попробовать 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',)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...