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

Django中如何使用字符串过滤Model以避免代码重复

简化冗余代码的方案

嘿,我帮你把这段重复的逻辑精简一下!你现在的问题是每个分类分支都在重复做「初始化列表+循环过滤」的操作,只是过滤字段和类型数量不一样,咱们把这些变化的参数抽出来,用通用逻辑统一处理就行。

优化后的代码示例

from .models import source

def myfunction(category1=False, category2=False):
    # 把每个分类对应的配置统一存在这里,新增分类直接加一行
    category_settings = [
        (category1, 'rowdata1', 5),
        (category2, 'rowdata2', 3),
        # 其他分类继续往下加就行,格式:(分类条件, 过滤字段名, 类型数量)
    ]
    
    # 找到当前激活的分类配置(第一个满足条件的)
    try:
        active_field, types_count = next((field, cnt) for cond, field, cnt in category_settings if cond)
    except StopIteration:
        # 处理没有任何分类激活的情况,比如返回空结果或者默认值
        return []  # 这里根据你的实际需求调整
    
    # 用列表推导式一次性生成结果,替代手动初始化+循环赋值
    b = [
        source.objects.filter(**{active_field: 'identifier', 'state': i})
        for i in range(types_count)
    ]
    
    # 这里继续处理你的result逻辑,比如基于b生成最终返回值
    result = ...  # 替换成你原来的result处理代码
    return result

关键优化点:

  • 配置化管理:把每个分类对应的「过滤字段」和「类型数量」存成元组列表,新增分类时只需要加一行配置,不用复制粘贴整个分支的代码,维护起来更方便。
  • 动态过滤参数:用**{active_field: 'identifier', 'state': i}这种字典解包的方式,动态传递过滤条件,避免写多个不同字段的filter调用。
  • 列表推导式简化循环:直接用推导式生成列表,省去手动初始化[None]*types再逐个赋值的步骤,代码更紧凑。
  • 异常处理:加了try-except处理没有分类激活的情况,避免程序崩溃,你可以根据实际需求修改这块的逻辑(比如返回默认结果或者抛出特定异常)。

如果你的category1、category2不是函数参数而是外部变量,只需要把category_settings里的条件改成对应的变量就行,逻辑是完全通用的~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:31:39