【问题标题】:How to group and filter objects by list objects如何按列表对象对对象进行分组和过滤
【发布时间】:2020-07-29 10:54:55
【问题描述】:

我必须得到每种问题的平均成绩值(1 个问题的多个成绩,1 个成绩的 1 个问题)。 在我的代码下方,仅获取用户获得的所有成绩,但我不知道如何按问题“分组”成绩以及为什么我的过滤器不起作用(返回400 错误请求)

@action(detail=False, methods=['post'])
    def results(self, request):
        user_id = request.data["user_id"]
        survey_id = request.data["survey_id"]
        self_rating_objects = Grade.objects.filter(interview__in=Interview.objects.filter( survey_id=survey_id, target_user_id=user_id))
        serializer = GradeSerializer(data=self_rating_objects,many=True)
        if serializer.is_valid():
            return Response(serializer.data,status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)

这是我的年级模型

class Grade(models.Model):
    created_at = models.DateField(auto_now_add=True)
    value = models.IntegerField()
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name="questions")
    interview = models.ForeignKey(Interview, on_delete=models.CASCADE, related_name="grades")

还有面试模型

class Interview(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="users")
    target_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="target_users")
    comment = models.TextField(default='')
    created_at = models.DateField(auto_now_add=True)
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE, related_name="interviews")

【问题讨论】:

    标签: python django filter group-by


    【解决方案1】:

    首先,我强烈建议在 django 之上使用 Jupyter https://medium.com/ayuth/how-to-use-django-in-jupyter-notebook-561ea2401852 习惯 ORM 之类的东西,对调试非常有用。

    在您的特定情况下,应该这样做:

    self_rating_objects = Grade.objects.filter(interview__survey=survey_id, interview__target_user=user_id)

    在过滤 Grade 时,您可以将与其相关的对象称为 Interview 并以“__”语义访问与 Interview 的关系。

    【讨论】:

    • 如果你真的很期待将它作为一个列表(不推荐)self_rating_objects = Grade.objects.filter(interview__in=[interview.id for interview in Interview.objects.filter( survey_id=survey_id, target_user_id=user_id)]) 或类似,因为实际上我没有看到面试的 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2023-01-25
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多