簡體   English   中英

Django 如何在串行器中注釋/分組並顯示它

[英]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']

PS 我嘗試了很多方法來解決這個問題,只是使用 django 查詢集功能,但它們中的每一個都會導致問題。 所以我就這樣用字典來解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM