如何在Django Filter中适配俄语客户端传入值的字段匹配?
当然可以在Django端搞定这个需求,完全不用修改客户端!我给你拆解下两种方案的实现思路,帮你选最适合的方式:
方案一:把俄语参数转成数据库存储的英文键(推荐)
你的模型里borrower_category存的是standard、payroll这种英文键,而客户端传的是翻译后的俄语显示值(比如对应Standard的俄语译文)。咱们可以利用Django的翻译系统,构建一个反向映射字典,把俄语值转成对应的英文键,再用来过滤查询。
具体代码实现可以这样改views.py:
from django.utils.translation import gettext as _ from .models import BORROWER_CATEGORY_STANDARD, BORROWER_CATEGORY_PAYROLL # 构建反向映射:翻译后的俄语值 -> 数据库存储的键 category_reverse_map = { _('Standard'): BORROWER_CATEGORY_STANDARD, _('Payroll'): BORROWER_CATEGORY_PAYROLL, } def your_view(request): # 获取客户端传的俄语参数 russian_category = request.POST.get('borrower_category') # 转成数据库能识别的英文键 db_category_key = category_reverse_map.get(russian_category) if db_category_key: cps = cps.filter(borrower_category=db_category_key) # 后续逻辑...
为什么这个能行?因为你已经开启了USE_I18N=True,且默认语言是俄语(LANGUAGE_CODE='ru'),_('Standard')会自动读取你已有django.po文件里的俄语译文,刚好匹配客户端传过来的值。如果以后要支持哈萨克语,只要po文件里有对应的翻译,这个映射会自动适配当前请求的语言环境,非常灵活。
方案二:给模型字段添加俄语翻译(不推荐)
如果一定要把模型字段值转成俄语,你需要用到django-modeltranslation扩展,给borrower_category字段添加俄语翻译字段(比如borrower_category_ru)。但这个方案有几个明显问题:
- 会修改数据库结构,新增翻译字段,增加后续维护成本
- 数据库存储翻译后的文本不如存储固定键值靠谱(比如俄语翻译可能出现拼写、格式变化,而键值是固定不变的)
- 查询时要针对翻译字段过滤,比如
cps.filter(borrower_category_ru=request.POST.get('borrower_category')),这就失去了用choices键值对设计的意义
所以这个方案远不如方案一实用,不建议选择。
结论:不用改客户端,选方案一就好
客户端传俄语参数是符合你当前语言配置的合理行为,完全不需要改动。方案一利用Django自带的翻译系统做反向映射,既符合Django i18n的设计规范,又能完美解决查询问题,代码也简洁易维护。
内容的提问来源于stack exchange,提问作者user11301070




