Как добавить значение обратного поля в набор данных сериализатора django - PullRequest
1 голос
/ 30 сентября 2019

У меня есть родительский идентификатор в объекте, который содержит дочерние данные. Я хочу добавить другое значение поля из родительского идентификатора в сериализатор для дочерней таблицы, чтобы вернуться к представлению

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

Обратная связь особенно запутана, потому что 1. она не работает для меня, и2. пример здесь использует его для родительского элемента, который уже использовался в качестве примера прямого отношения. https://www.django -rest-framework.org / api-guide / serializers /

class ChoiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Choice
        fields = ['choice_text', 'votes', 'question']

class QuestionSerializer(serializers.ModelSerializer):
    choice = ChoiceSerializer(many=True)

    class Meta:
        model = Question
        fields = ['id', 'question_text', 'choice']

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)# Create your models here.
    def __str__(self):
        return self.choice_text

s = ChoiceSerializer(data={'choice_text':'tests','votes': 50, 'question':1})
s.is_valid()
s.save()

Я получил это от s.data: ReturnDict ([('choice_text', 'tests'), ('voice', 50), ('question', 1)])

Я бы предпочел следующее: ReturnDict ([('choice_text', 'tests'), ('voice', 50), ('question_test', 'hello')])

1 Ответ

0 голосов
/ 30 сентября 2019

Главным образом для этого требования изменить / добавить дополнительную информацию из экземпляра модели, сериализовать данные, один из возможных способов сделать это - использовать SerializerMethodField.

Кроме того, мы можем использовать тот же сериализатор для обновления данных, а также для получения сериализованных данных для ответа. что я хочу иметь в виду при сохранении информации через сериализатор, нам нужно поле question, но при получении данных нам нужно question_test.

class ChoiceSerializer(serializers.ModelSerializer):
    question_test = serializers.SerializerMethodField()

    class Meta:
        model = Choice
        fields = ['choice_text', 'votes', 'question', 'question_test']
        extra_kwargs = {'question': {'write_only': True}}



    def get_question_test(self, obj):
        return obj.question.question_test

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