Получите StringRelatedField вместе с PrimaryKeyRelatedField, используя Serializer в DRF - PullRequest
0 голосов
/ 27 апреля 2018

Извините за этот вопрос новичка, но я просто не могу найти способ прочитать руководство.

модель

    #Subject
class TemaPai(models.Model):
    subject = models.TextField()
    disciplines = models.ManyToManyField(Materia)

    # order = models.IntegerField(blank=True, null=True)

    def __str__(self):
        return self.subject

    class Meta:
        verbose_name_plural = "temas-pais (subjects)"


# Order and junction
class TemaPaiOrdem(models.Model):
    subject = models.ForeignKey(TemaPai, on_delete=models.CASCADE)
    discipline = models.ForeignKey(Materia, on_delete=models.CASCADE)
    order = models.IntegerField()

    def __str__(self):
        var2 = self.subject.subject
        var = self.discipline.discipline
        return var2 + ' - ' + var

    class Meta:
        verbose_name_plural = "Temas-pais-ordem"
        unique_together = ('subject', 'discipline')

сериализаторы

class TemaPaiSerializer(serializers.ModelSerializer):

    disciplines = serializers.PrimaryKeyRelatedField(many=True, queryset=Materia.objects.all())
    class Meta:
        model = TemaPai
        fields = ('id', 'subject', 'url', 'disciplines')


class TemaPaiOrdemSerializer(serializers.ModelSerializer):

    discipline = serializers.PrimaryKeyRelatedField(queryset=Materia.objects.all())
    subject = serializers.PrimaryKeyRelatedField(queryset=TemaPai.objects.all())
    class Meta:
        model = TemaPaiOrdem
        fields = ('id', 'subject','discipline', 'order')

Ну, TemaPaiOrdemSerializer выдает мне такой список:

[
    {
        "id": 1,
        "subject": 1,
        "discipline": 1,
        "order": 1
    },
    {
        "id": 2,
        "subject": 2,
        "discipline": 1,
        "order": 11
    }
]

Хорошо. Но я хочу получить представление строки объекта (из модели TemaPai), а также поле read_only. Таким образом, мой желаемый список будет выглядеть примерно так:

[
    {
        "id": 1,
        "subject": 1,
        "subject_name": "Introduction",
        "discipline": 1,
        "order": 1
    },
    {
        "id": 2,
        "subject": 2,
        "subject_name": "Advanced stuff",
        "discipline": 1,
        "order": 11
    }
]

Я пытаюсь использовать

subject_name = serializers.ReadOnlyField(source:'subject')

безуспешно. Любая подсказка будет оценена.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Использование,

subject_name = serializers.StringRelatedField(source='subject',read_only=True)


следовательно, ваш сериализатор будет выглядеть так:

class TemaPaiOrdemSerializer(serializers.ModelSerializer):
    discipline = serializers.PrimaryKeyRelatedField(queryset=Materia.objects.all())
    subject = serializers.PrimaryKeyRelatedField(queryset=TemaPai.objects.all())
    subject_name = serializers.StringRelatedField(source='subject',read_only=True)

    class Meta:
        model = TemaPaiOrdem
        fields = ('id', 'subject', 'subject_name', 'discipline', 'order')
0 голосов
/ 27 апреля 2018

Вы можете использовать . в source аргумент для поля поиска связанной модели, например:

subject_name = serializers.ReadOnlyField(source='subject.subject')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...