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'
)
)
我是 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'
)
)