[英]Django How To annotate/Group by & Display it in Serializer
我有關注 Model
class ModelAnswer(BaseModel):
questions = models.ForeignKey(
to=Question,
on_delete=models.CASCADE
)
answer = models.TextField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
基本上用例是可以多次添加答案,即一次可以添加3個答案,並且需要為特定問題添加所有答案
為了方便起見,我剛剛制作了另一個 model 以在下一個 model 中跟蹤這些事情。
class AnswerLog(BaseModel):
answer = models.ForeignKey(to=ModelAnswer, on_delete=models.CASCADE, null=True, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
order = models.PositiveIntegerField(null=True, blank=True)
我收到了這種格式的回復
[
{
"answer":{
"id":42,
"user":1,
"questions":"what did you do today",
"subcategory":"Circumstance",
"is_intentional":"False",
"answer":"I played well",
"created_at":"2022-09-05T21:00:57.604051"
},
"order":1,
"category":"sports"
},
{
"answer":{
"id":43,
"user":1,
"questions":"what was your achievment?",
"subcategory":"Result",
"is_intentional":"False",
"answer":"a broked my leg",
"created_at":"2022-09-05T21:00:57.626193"
},
"order":1,
"category":"sports"
}
]
我只是希望我的上述回復以這種方式更簡單一些,只需按順序和類別組合,因為兩者都會(對於另一個答案,類別仍然可以相同,因此下一個答案的順序只會不同,即 2)
[{
"answer":[{
"id":42,
"user":1,
"questions":"what did you do today",
"subcategory":"Circumstance",
"is_intentional":"False",
"answer":"I played well",
"created_at":"2022-09-05T21:00:57.604051"
},{
"id":43,
"user":1,
"questions":"what was your achievment?",
"subcategory":"Result",
"is_intentional":"False",
"answer":"a broked my leg",
"created_at":"2022-09-05T21:00:57.626193"
}],
"order":1,
"category":"sports",
}
]
我的序列化器如下
class AnswerLogSerializer(serializers.ModelSerializer):
answer = ListAnswerSerializer()
category = serializers.CharField(source='answer.questions.category.name')
class Meta:
model = AnswerLog
fields = ['answer','order', 'category']
我的看法是
class ListAnswerLogView(generics.ListAPIView):
serializer_class = serializers.AnswerLogSerializer
def get_queryset(self):
return AnswerLog.objects.all()
看法
from collections import defaultdict
class ListAnswerLogView(ListAPIView):
serializer_class = AnswerLogSerializer
def get_queryset(self):
grouped_answers = defaultdict(lambda: dict(answer=set()))
for answer_log in AnswerLog.objects.all():
grouped_by_key = (
answer_log.order,
answer_log.answer.questions.category
)
grouped_answers[grouped_by_key]['answer'].add(answer_log.answer)
for key in grouped_answers:
grouped_answers[key].update(dict(
order=key[0],
question_category=key[1]
))
return grouped_answers.values()
串行器
class AnswerLogSerializer(serializers.ModelSerializer):
answer = ListAnswerSerializer(many=True)
category = serializers.CharField(source='question_category.name')
class Meta:
model = AnswerLog
fields = ['answer', 'order', 'category']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.