Создание сериализатора для отображения правильных данных - PullRequest
0 голосов
/ 21 ноября 2018

у меня 4 модели.User, Question, Choice и Voting.Это в основном приложение для опросов, которое я пытаюсь создать.Вопрос может иметь много вариантов.Модель Voting отслеживает, что каждый пользователь выбрал в качестве ответа.

Что я хотел бы сделать, это получить все вопросы, а также проверить, какой выбор вошел в систему выбранный пользователь для каждого вопроса.Вот модели:

class Question(models.Model):
    user            = models.ForeignKey(User, on_delete=models.CASCADE)
    status          = models.CharField(max_length=200)
    total_votes     = models.IntegerField(default=0)

class Choice(models.Model):
    question    = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice      = models.CharField(max_length=120)
    vote_count  = models.IntegerField(default=0)

class Voting(models.Model):
    user    = models.ForeignKey(User, on_delete=models.CASCADE)
    choice  = models.ForeignKey(Choice, on_delete=models.CASCADE)

Вот как я хочу отображать данные:

{
    user: 2
    status: "Hello"
    total_votes: 101
    choices: [
                {
                    "id": 2,
                    "choice": "first choice",
                    "vote_count": 31,
                    "question": 3
                },
                {
                    "id": 4,
                    "choice": "second choice",
                    "vote_count": 70,
                    "question": 3
                }
            ],
    choice_selected: 2
}

В приведенных выше данных вошедший в систему пользователь выбрал вариант 2 в этом конкретном вопросе.

Редактировать: Моя попытка добавить сериализатор, но при этом отображается объект типа 'Голосование', не сериализуемый JSON

class ChoiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Choice
        fields = '__all__'

class QuestionSerializer(serializers.ModelSerializer):
    choices = ChoiceSerializer(source='choice_set', many=True)
    class Meta:
        model = Question
        fields = '__all__'


class GetProfileQuestions(ListAPIView):
    serializer_class = QuestionSerializer

    def get_queryset(self):
        return Question.objects.all()

Этот запрос успешно распечатывает каждый вопрос и его варианты.Однако как мне сделать так, чтобы он также распечатывал, какой выбор пользователь выбрал для каждого вопроса?

class VotingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Voting
        fields = '__all__'    


class ChoiceSerializer(serializers.ModelSerializer):
    votes = VotingSerializer(source='voting_set', many=True)
    class Meta:
        model = Choice
        fields = '__all__'


class QuestionSerializer(serializers.ModelSerializer):
    choices = ChoiceSerializer(source='choice_set', many=True)
    choice_selected = serializers.SerializerMethodField()
    class Meta:
        model = Question
        fields = '__all__'

    def get_choice_selected(self, obj):
        choice_selected = Voting.objects.filter(choice__question=obj.id).filter(user=obj.user)
        return choice_selected

1 Ответ

0 голосов
/ 21 ноября 2018

Я думаю, вы захотите это в своем классе QuestionSerializer

 choice_selected = serializers.SerializerMethodField()

и определите метод, который выглядит примерно так в QuestionSerializer…

def get_choice_selected(self, obj):
        choice_selected = Voting.objects.filter(choice__question=obj.id).filter(user=obj.user)
        return choice_selected

Выше не протестировано.

...