у меня 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