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

Django类视图通过URL参数做日期范围过滤返回空查询集问题

问题原因及解决办法

核心问题

你在get_queryset里用了.values(),返回的是字典组成的QuerySet,但你的BudgetSerializer是基于BudgetModel模型的,它只能序列化模型实例,无法处理字典,所以序列化环节失败,最终返回空数组。而你打印的是QuerySet本身,所以能看到数据,但返回后被序列化时出错了。

解决步骤

  1. 移除.values(),返回模型实例QuerySet
    修改get_queryset里的查询语句,去掉.values():
def get_queryset(self):
    user = self.request.user.username
    budget_date_url = self.request.GET.get('budget_date', None)
    budget_end_date_url = self.request.GET.get('budget_end_date', None)

    # 先获取当前用户的所有数据
    queryset = BudgetModel.objects.filter(current_user=user)
    
    if budget_date_url is not None and budget_end_date_url is not None:
        # 追加日期过滤条件
        queryset = queryset.filter(budget_date__gte=budget_date_url, budget_date__lte=budget_end_date_url)
    
    print(queryset)
    return queryset
  1. 修复分支逻辑漏洞
    原来的代码如果没有budget_date_url参数,get_queryset会没有返回值,这会导致视图报错。上面的代码先初始化当前用户的查询集,再根据参数追加过滤,确保任何情况都有返回值。

  2. 可选:用DjangoFilterBackend规范日期范围过滤
    如果你想保留DjangoFilterBackend,可以自定义FilterSet来处理日期范围,避免手动解析URL参数:

# 在views.py顶部导入
import django_filters
from .models import BudgetModel

# 自定义FilterSet
class BudgetDateFilter(django_filters.FilterSet):
    # 定义日期范围过滤字段,对应URL参数:budget_date_after和budget_date_before
    budget_date = django_filters.DateFromToRangeFilter()

    class Meta:
        model = BudgetModel
        fields = ['budget_category', 'budget_account']

# 修改视图配置
@permission_classes([IsAuthenticated])
class BudgetFilter(generics.ListAPIView):
    serializer_class = BudgetSerializer
    paginator = None
    filter_backends = [DjangoFilterBackend]
    filterset_class = BudgetDateFilter  # 替换成自定义FilterSet

    def get_queryset(self):
        # 只需要返回当前用户的数据,过滤逻辑交给FilterSet
        return BudgetModel.objects.filter(current_user=self.request.user.username)

此时URL参数可以改成:http://127.0.0.1:8000/budget-filter?budget_date_after=2023-6-7&budget_date_before=2023-6-13,更符合Django过滤的规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:36