创建序列化程序以显示正确的数据

Posted

技术标签:

【中文标题】创建序列化程序以显示正确的数据【英文标题】:Creating serializer to display correct data 【发布时间】:2019-04-23 12:09:46 【问题描述】:

我有 4 个模型。 UserQuestionChoiceVoting。这基本上是我正在尝试创建的投票应用程序。一个问题可以有很多选择。 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。

编辑:我尝试添加序列化程序,但显示“投票”类型的 Object is not JSON serializable

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】:

我想你会希望在 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

以上内容未经测试。

【讨论】:

嗯,我收到了这个错误:Object of type 'Voting' is not JSON serializable 然后为它添加一个序列化器。 在这种情况下你会怎么做?我对序列化程序中的函数不太熟悉 我会为ChoiceSerializer 添加一个序列化程序类,但类名将是VotingSerializer,它会有Model = Voting 嗯,我这样做了,但我得到了同样的错误。我在我的问题中添加了我所做的,请查看编辑,看看我是否正确?

以上是关于创建序列化程序以显示正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以正确聚合时间序列数据以使用 matplotlib/seaborn 制作散点图?

以正确的方式使用天气数据对时间序列进行上采样

YAML序列样式

如何让Jackson JSON生成的数据包含的中文以unicode方式编码

Mongo自定义序列化程序导致无法创建抽象类

Django rest框架嵌套序列化程序创建方法