измените сериализатор, чтобы показать и идентификатор, и заголовок поля foreignKey - PullRequest
0 голосов
/ 05 декабря 2018

Я использую DRF, и у меня есть сериализатор профиля с полем группы, которое является моделью ForeignKey to Group.Сериализатор профиля:

class ProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = Profile
        fields = ('group', ...)

Модель профиля:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # other fields
    group = models.ForeignKey(Group, on_delete=models.CASCADE)

Модель группы:

class Group(models.Model):
    title = models.CharField(max_length=100)

    def __str__(self):
        return self.title

Сериализатор группы:

class GroupSerializer(serializers.ModelSerializer):

    class Meta:
        model = Group
        fields = ('title', 'id')
        extra_kwargs = {'id': {'read_only': True}}

У меня естьмаршрут в моем SPA, который показывает список профилей.Я хочу показать заголовок группы для каждого профиля, но этот сериализатор предоставляет мне только идентификатор группы, и я не хочу создавать другое представление, чтобы получить идентификатор группы и дать мне заголовок.поэтому я искал об этом, и это было сначала решение StringRelatedField, то есть read_only и SlugRelatedField.Я изменил ProfileSerializer и добавил SlugRelatedField следующим образом:

class ProfileForAdminSerializer(serializers.ModelSerializer):
    group = serializers.SlugRelatedField(
        many=False,
        queryset=Group.objects.all(),
        slug_field='title'
    )

    class Meta:
        model = Profile
        fields = ('group', ...)

Теперь у меня есть доступ к заголовку группы профилей, но проблема в том, что мне нужно создать профиль с указанием заголовка поля группы, но я хочусоздать профиль, как и прежде, с отправкой идентификатора группы, а также иметь доступ к заголовку группы без отправки другого запроса.(извините за плохой английский)

1 Ответ

0 голосов
/ 06 декабря 2018

Рассматривали ли вы аргумент source в поле сериализатора?

Должно быть что-то вроде этого

group_title = serializers.ReadOnlyField(source='group.title')

class Meta:
    ...
    fields = ('group_title', ...)

проверьте здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...