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

如何在Django ORM中处理多个GET查询参数及其缺失场景?

优化方案

可以通过动态构建查询条件字典的方式,将多个可选查询参数的过滤逻辑统一处理,避免重复的条件判断,后续新增过滤参数也只需简单扩展配置即可:

# articles/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Article
from .serializers import ArticleSerializer

@api_view(['GET', ])
def articles_view(request):
    """
    Retrieves information about all published blog articles.
    """
    # 基础查询条件:仅已发布文章
    query_filters = {'published': True}
    
    # 配置GET参数与模型过滤字段的映射关系
    # 后续新增tags、categories等参数时,直接在这里添加键值对即可
    param_field_mapping = {
        'language': 'language__iexact',
        # 示例:新增tags过滤(假设tags是多对多字段,按名称匹配)
        # 'tags': 'tags__name__iexact',
        # 示例:新增categories过滤
        # 'categories': 'categories__name__iexact',
    }
    
    # 遍历映射,将存在的查询参数加入过滤条件
    for param_name, model_field in param_field_mapping.items():
        param_value = request.GET.get(param_name)
        if param_value:
            query_filters[model_field] = param_value
    
    try:
        # 统一执行查询,无需分支判断
        articles = Article.objects.filter(**query_filters).order_by('-created_at')
    except Article.DoesNotExist:
        # 捕获具体异常,避免误捕其他无关错误
        return Response(status=status.HTTP_404_NOT_FOUND)
    
    serializer = ArticleSerializer(articles, many=True, exclude=('content', 'author',))
    return Response(serializer.data)

核心优化点:

  • 动态构建过滤条件:用字典存储基础条件和动态参数对应的过滤规则,通过**解包传入filter(),替代多分支判断
  • 可扩展性强:后续新增tags、categories等过滤参数时,只需在param_field_mapping中添加对应的参数名和模型字段,无需修改查询逻辑
  • 异常处理更精准:将裸except改为捕获Article.DoesNotExist具体异常,避免捕获序列化错误、参数解析错误等无关异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:10:17