如何在Django REST Framework中统计指定活动的用户数量
解决方案
1. 先修正序列化器(serializers.py)
你的FormSerializer写法有误,应该继承ModelSerializer,修正后代码如下:
from rest_framework import serializers from .models import FormDetails class FormSerializer(serializers.ModelSerializer): class Meta: model = FormDetails fields = ['event_name','page_index','device','metadata','session_data','ip_address','time','user_unique_identifier','status','page_name','button_name']
2. 实现动态活动用户统计接口
下面提供两种通用方案,不用硬编码活动名称,直接通过参数获取:
方案一:URL查询参数传递活动名称(推荐)
修改views.py中的userbyevent方法,加上装饰器并完善逻辑:
from django_filters.rest_framework import DjangoFilterBackend class FormViewSet(viewsets.ModelViewSet): # 保留原有代码... filter_backends = [DjangoFilterBackend] @action(detail=False, methods=['get']) def userbyevent(self, request): event_name = request.query_params.get('event_name') if not event_name: return Response({'error': '需传入event_name参数'}, status=400) # 统计该活动下的唯一用户数(去重user_unique_identifier) unique_user_count = FormDetails.objects.filter(event_name=event_name).values('user_unique_identifier').distinct().count() return Response({ 'event_name': event_name, 'unique_user_count': unique_user_count })
使用示例:访问 your-domain/api/forms/userbyevent/?event_name=Eye Care 即可获取对应活动的用户数。
方案二:URL路径参数传递活动名称
如果偏好通过路径传递(比如your-domain/api/forms/userbyevent/Eye Care/),可以用下面的写法:
@action(detail=False, methods=['get'], url_path='userbyevent/(?P<event_name>[^/]+)') def userbyevent(self, request, event_name): # 若URL中用了slug格式(如eye-care),可在此转回原名称:event_name = event_name.replace('-', ' ') unique_user_count = FormDetails.objects.filter(event_name=event_name).values('user_unique_identifier').distinct().count() return Response({ 'event_name': event_name, 'unique_user_count': unique_user_count })
关键提示
- 统计用户数时必须用
distinct()去重,否则得到的是该活动的记录总数,而非实际用户数(同一个用户可能有多条记录)。 - 确保已安装
django-filter(执行pip install django-filter),并在项目settings.py的INSTALLED_APPS中添加'django_filters'。 - 那些硬编码的
userbyeyeevent等方法可以直接删除,用通用接口替代,减少冗余代码。
内容的提问来源于stack exchange,提问作者Rishabh Sharma
相关产品推荐
相关产品推荐

