我是 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'
)
)
添加回答
举报
0/150
提交
取消