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

如何使用count()统计指定日期范围内的关联Order数据

实现按指定日期范围统计Article关联Order数量的需求

问题背景

现有代码通过ArticleSerializer的get_orders方法统计关联的全部Order数量,需求改为统计timestamp处于用户指定的两个日期之间的Order数量。

解决方案

步骤1:在视图集中接收日期参数并传递给序列化器

修改ArticleViewSet,从请求查询参数中获取日期范围,并传入序列化器上下文:

class ArticleViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = Article.objects.all().order_by('-timestamp')
    serializer_class = ArticleSerializer
    filter_backends = [filters.SearchFilter,DjangoFilterBackend]
    pagination_class = StandardResultsSetPagination
    search_fields = ['^articlechoices__item','^caption','^name']
    filterset_fields = ['author','price','location','category']

    def get_serializer_context(self):
        context = super().get_serializer_context()
        # 从URL查询参数中提取日期范围
        start_date = self.request.query_params.get('start_date')
        end_date = self.request.query_params.get('end_date')
        if start_date and end_date:
            context['start_date'] = start_date
            context['end_date'] = end_date
        return context

步骤2:修改序列化器的统计逻辑

更新ArticleSerializer的get_orders方法,根据日期参数过滤Order后统计数量:

from datetime import datetime

class ArticleSerializer(serializers.ModelSerializer):
    orders = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Article
        fields = '__all__'

    def get_orders(self, obj):
        # 从上下文获取日期参数
        start_date = self.context.get('start_date')
        end_date = self.context.get('end_date')
        
        if start_date and end_date:
            try:
                # 转换为datetime对象(默认支持YYYY-MM-DD格式)
                start_dt = datetime.strptime(start_date, '%Y-%m-%d')
                end_dt = datetime.strptime(end_date, '%Y-%m-%d')
                # 过滤指定日期范围内的Order并统计数量
                return obj.ordersarticle.filter(
                    timestamp__gte=start_dt,
                    timestamp__lte=end_dt
                ).count()
            except ValueError:
                # 日期格式错误时返回全部数量
                return obj.ordersarticle.count()
        # 未传日期参数时保持原有逻辑,返回全部关联Order数量
        return obj.ordersarticle.count()

步骤3:请求示例

发起请求时携带日期参数即可获取指定范围的统计结果,示例请求:

GET /api/articles/?start_date=2024-03-04&end_date=2024-03-11

补充说明

  • 若需支持其他日期格式,可修改strptime的格式字符串(如%Y-%m-%d %H:%M:%S支持带时分秒的格式)。
  • 异常处理保证了接口在日期格式错误时不会崩溃,兼容原有逻辑。

内容的提问来源于stack exchange,提问作者user14491987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:10:11