You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Django Filter中适配俄语客户端传入值的字段匹配?

当然可以在Django端搞定这个需求,完全不用修改客户端!我给你拆解下两种方案的实现思路,帮你选最适合的方式:

方案一:把俄语参数转成数据库存储的英文键(推荐)

你的模型里borrower_category存的是standardpayroll这种英文键,而客户端传的是翻译后的俄语显示值(比如对应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

火山引擎 最新活动