在序列化程序中显示相关模型的投票最多的成员
Show most voted member of related model in serializer
我有以下型号:
- 问题
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)
- 投票回答
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_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()
你可以这样尝试 Count
:
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
我有以下型号:
- 问题
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)
- 投票回答
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_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()
你可以这样尝试 Count
:
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