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

Django annotate() and count() conditional from 0 to null

我是 django 和 django-rest-framework 的新手,我想知道是否可以将条件 if else 放在 annotate(total_sessions=Count()) where if Count() = 0 then total_sessions="空"?我有一个项目,如果总会话数等于 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
        )
    )

您正在寻找 Conditional Expressions 在 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'
        )
    )