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

我是 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.py


class ClassStatisticsSerializer(ModelBaseSerializer):

    total_sessions = serializers.IntegerField()


    class Meta:

        model = Class

        fields = (

           'id',

           'batch',

           'type,

           'total_sessions'

        )

views.py


from django.db.models import Count, Q

class ClassStatisticsList(APIView):

    condition = {}

    if date:

        condition = {'classactivity__date':date}


    queryset = Class.objects.all().annotate(

        total_sessions=Count(

            'classactivity',

            filter=Q(**condition),

            distinct=True

        )

    )


慕村9548890
浏览 180回答 1
1回答

catspeake

您正在寻找在 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'        )    )
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python