在序列化程序中显示相关模型的多数投票成员

2024-04-29 11:26:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

  • 问题:
class Question(models.Model):
    question_text = models.CharField(max_length=450)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    posted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  • 答复
class Answer(models.Model):
    question = models.ForeignKey(Question, related_name='answers', on_delete=models.CASCADE)
    answer_text = models.CharField(max_length=5000)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    posted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

  • VoteAnswer
class VoteAnswer(models.Model):
    answer = models.ForeignKey(Answer, related_name='votes', on_delete=models.CASCADE)
    voted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

问题序列化程序

class QuestionSeriaizer(serializers.HyperlinkedModelSerializer):

    answer_count = serializers.SerializerMethodField()
    posted_by = UserDetailSerializer(read_only=True)

    class Meta:
        model = Question
        fields = ('url', 'id', 'question_text', 'created_at', 'updated_at', 'posted_by', 'answer_count', 'page',
                  'who_can_answer')
        depth = 1

    @staticmethod
    def get_answer_count(obj):
        return obj.answers.all().count()

我想要达到的目标:

问题序列化程序中应该有一个“top\u answer”字段,该字段的答案得票最多。

我尝试了以下方法,但没有成功:

class QuestionSeriaizer(serializers.HyperlinkedModelSerializer):

    answer_count = serializers.SerializerMethodField()
    top_answer = serializers.SerializerMethodField()
    posted_by = UserDetailSerializer(read_only=True)

    class Meta:
        model = Question
        fields = ('url', 'id', 'question_text', 'created_at', 'updated_at', 'posted_by', 'answer_count', 'page',
                  'who_can_answer', 'top_answer')
        depth = 1

    @staticmethod
    def get_answer_count(obj):
        return obj.answers.all().count()

    @staticmethod
    def get_top_answer(obj):
        return obj.answers.annotate(total_votes=obj.answers.votes.all().count()).order_by('total_votes').first()


1条回答
网友
1楼 · 发布于 2024-04-29 11:26:23

您可以使用^{}这样尝试:

from django.db.models import Count

class QuestionSeriaizer(serializers.HyperlinkedModelSerializer):
    # rest of the code
    def get_top_answer(obj):
        return obj.answers.annotate(total_votes=Count('votes')).order_by('total_votes').first().answer_text

如果您有AnswerSerializer,则可以尝试:

def get_top_answer(obj):
   answer = obj.answers.annotate(total_votes=Count('votes')).order_by('total_votes').last()
   return AnswerSerializer(answer).data

相关问题 更多 >