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

如何在DRF中实现基于end_date字段的有效广告时间过滤?

问题描述

我有一个API,对应的模型包含表示广告结束时间的end_date字段,类型为DateTimeField:

end_date = DateTimeField(null=True, blank=True)

视图中已实现多种广告过滤方式,现需添加复选框功能,通过对比当前时间与end_date字段值,仅展示未过期的有效广告。请问能否借助DRF的DjangoFilterBackend实现类似如下结构的功能:

class AdAPI(generics.ListAPIView):
    queryset = Ad.objects.all()
    serializer_class = AdSerializers
    filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
    filterset_class = AdFilterSet

希望能得到相关实现提示。

实现方案

完全可以通过DjangoFilterBackend实现这个需求,核心是自定义FilterSet并添加布尔类型的过滤逻辑:

  1. 定义自定义FilterSet
    导入所需模块,创建AdFilterSet类,添加一个BooleanFilter字段,通过自定义方法实现未过期广告的过滤逻辑:

    from django_filters import FilterSet, BooleanFilter
    from django.utils import timezone
    from django.db.models import Q
    from .models import Ad
    
    class AdFilterSet(FilterSet):
        # 定义布尔过滤字段,对应前端复选框
        is_active = BooleanFilter(method='filter_active_ads')
    
        class Meta:
            model = Ad
            # 保留原有的过滤字段,替换为你实际的其他过滤字段
            fields = ['is_active', ...]
    
        def filter_active_ads(self, queryset, name, value):
            # 当复选框勾选(value=True)时,过滤未过期广告
            if value:
                now = timezone.now()
                # 未过期逻辑:end_date为空(永久有效) 或者 end_date晚于当前时间
                return queryset.filter(
                    Q(end_date__isnull=True) | Q(end_date__gt=now)
                )
            # 未勾选时返回原查询集
            return queryset
    
  2. 关联视图与FilterSet
    保持你原有的视图结构不变,确保filterset_class指向上面定义的AdFilterSet即可:

    from rest_framework import generics, filters
    from .filters import AdFilterSet
    from .serializers import AdSerializers
    from .models import Ad
    
    class AdAPI(generics.ListAPIView):
        queryset = Ad.objects.all()
        serializer_class = AdSerializers
        filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
        filterset_class = AdFilterSet
    
  3. 前端参数传递
    前端的复选框可以绑定is_active参数:

    • 当复选框勾选时,请求URL携带?is_active=true,即可返回未过期的有效广告
    • 未勾选时,不传递该参数或传递?is_active=false,返回所有广告(包含过期的)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:50:02