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
相关产品推荐
相关产品推荐

