You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:20:25