django 批量使用 同一个表的字段做转换

使用结束减去开始时间

  • 批量更新已经超时的记录
ExamRecord.objects.filter(
        over_time__lt=datetime.datetime.now(), submit=1
    ).update(
        submit=3,
        use_time=ExpressionWrapper(
            Extract(F('over_time') - F('start_time'), 'epoch') / 60,
            output_field=IntegerField()
        )
    )

利用子查询 关联到另一个表 批量更新

  • 答案表的如果题目正确 则另外一个获取分数
 ExamRecordAnswer.objects.filter(
        exam_record__submit__gt=1,
        score=0.00,
        exam_paper_question__question__answer=F('answer'),
    ).annotate(
        ok_score=Subquery(
            ExamPaperQuestion.objects.filter(
                uuid=OuterRef('exam_paper_question_id')
            ).values(
                'score'
            )[:1],
            output_field=DecimalField(max_digits=5, decimal_places=2)
        )
    ).update(
        is_ok=True,
        score=F('ok_score')
    )

利用子查询 汇总另外一个表

  • 计算分数并汇总分数
ExamRecord.objects.filter(
        answer_exam_record__is_ok=True,
        submit__gt=1,
        score=0.00
    ).update(
        score=Subquery(
            ExamRecordAnswer.objects.filter(
                exam_record_id=OuterRef('uuid'),
                is_ok=True
            ).values(
                'exam_record_id'
            ).annotate(
                total_score=Sum('score')
            ).values(
                'total_score'
            )[:1]
        )
    )
posted @ 2023-07-19 11:14  vx_guanchaoguo0  阅读(14)  评论(0编辑  收藏  举报