如何在Django中通过内省获取合法的Field Lookups列表?
获取Django Field合法Lookups的程序化方案
Django没有提供类似Model._meta.get_fields()的直接内省方法来一次性获取所有通用Field Lookups,但可以通过以下两种可靠方式实现需求:
1. 从字段实例获取支持的Lookups
每个Django字段实例都自带get_lookups()方法,会返回该字段支持的所有lookup名称与对应类的映射。你可以针对单个字段或遍历所有字段收集信息:
from myapp.models import Issue # 获取单个字段的支持lookups title_field = Issue._meta.get_field("title") title_supported_lookups = list(title_field.get_lookups().keys()) # 输出示例:['exact', 'iexact', 'contains', 'icontains', 'startswith', 'istartswith', ...] # 遍历模型所有字段,收集所有去重后的lookups all_lookups = set() for field in Issue._meta.get_fields(): if hasattr(field, 'get_lookups'): all_lookups.update(field.get_lookups().keys()) all_lookups = sorted(all_lookups)
2. 直接访问Django的默认Lookup注册
Django的基类Field维护了所有通用lookups的注册信息,可通过私有属性_default_lookups直接获取(当前Django 3.x/4.x/5.x版本稳定可用):
from django.db.models.fields import Field # 获取所有通用Field Lookups default_general_lookups = list(Field._default_lookups.keys()) # 输出示例:['exact', 'iexact', 'contains', 'icontains', 'gt', 'gte', 'lt', 'lte', 'in', 'range', ...]
额外建议
- 若需区分字段类型的专属lookups(比如日期字段的
year/month、数字字段的mod),可以按字段类型分组收集,前端展示时对应字段只显示其支持的lookups,避免无效查询。 - 保存筛选条件到JSONField时,要严格遵循Django filter的格式要求:比如
in对应数组值、range对应双元素数组,前端传递时需做格式校验。
内容的提问来源于stack exchange,提问作者Ashwin Balamohan
相关产品推荐
相关产品推荐

