为了账号安全,请及时绑定邮箱和手机立即绑定

Django annotate() 和 count() 条件从 0 到 null

Django annotate() 和 count() 条件从 0 到 null

慕村9548890 2023-05-09 15:11:13
我是 django 和 django-rest-framework 的新手,我想知道是否可以在 annotate(total_sessions=Count()) where if Count() = 0 then total_sessions="null" 上放置条件 if else?我有一个项目,如果总会话数等于 0,则输出必须为空。我虽然在 total_sessions 上使用 SerializerMethodField() 来获取计数,但这会导致多个 SQL 查询导致 API 响应缓慢,这就是它不可能的原因。下面的示例代码用于 serializers.py 和 views.py(这只是一个示例代码,因为我的真实代码有多个查询集)。serializers.pyclass ClassStatisticsSerializer(ModelBaseSerializer):    total_sessions = serializers.IntegerField()    class Meta:        model = Class        fields = (           'id',           'batch',           'type,           'total_sessions'        )views.pyfrom django.db.models import Count, Qclass ClassStatisticsList(APIView):    condition = {}    if date:        condition = {'classactivity__date':date}    queryset = Class.objects.all().annotate(        total_sessions=Count(            'classactivity',            filter=Q(**condition),            distinct=True        )    )
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

您正在寻找在 Django 站点上有详细记录的条件表达式。

我没有尝试过以下代码片段(这只是您的代码增强),它只是给您一个起点:

queryset = Class.objects.all()

    .annotate(

        total_session_cnt=Count(

            'classactivity',

            filter=Q(**condition),

            distinct=True

        )

    )

    .annotate(

        total_sessions=Case(

            When(total_session_count=0, then=Value(None, output_field=IntegerField())),

            default='total_session_count'

        )

    )


查看完整回答
反对 回复 2023-05-09
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信