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

如何从Mixin访问Django Parler翻译后的模型字段?附模型代码

在Mixin中访问Django Parler翻译后的Course模型字段

嘿,针对你的问题,我来分享几个实用方法,都是基于你提供的Course模型来举例的:

1. 直接访问翻译字段(自动适配当前语言)

Django Parler已经帮我们做了封装,TranslatableModel的实例可以直接通过属性名访问当前激活语言的翻译值,就像操作普通模型字段一样简单。

比如写一个Mixin:

class CourseTranslationMixin:
    def get_course_info(self, course: Course):
        # 直接获取当前语言的title和overview
        translated_title = course.title
        translated_overview = course.overview
        return {"title": translated_title, "overview": translated_overview}

在使用这个Mixin的类里,只要传入Course实例,就能拿到对应语言的翻译内容了。

2. 指定语言获取翻译

如果需要获取特定语言的翻译(不是当前激活的语言),可以用模型实例的get_translation()方法,还可以配合has_translation()做存在性检查,避免报错:

class CourseMultiLangMixin:
    def get_translated_title(self, course: Course, lang_code: str):
        # 检查是否有该语言的翻译
        if course.has_translation(lang_code):
            translation = course.get_translation(lang_code)
            return translation.title
        # 没有的话可以返回当前语言的翻译或者默认值
        return course.title
    
    def get_all_translations(self, course: Course):
        # 获取所有已存在的翻译实例
        all_translations = course.get_translations()
        return {trans.language_code: trans.title for trans in all_translations}

3. 在查询集层面过滤/访问翻译字段

如果你的Mixin需要处理查询集(比如在视图Mixin里),可以用Parler提供的translated()查询集方法,来过滤特定语言的翻译内容:

class CourseQueryMixin:
    def get_filtered_courses(self, keyword: str):
        # 过滤当前语言下标题包含关键词的课程
        return Course.objects.translated(title__icontains=keyword)
        
    def get_french_courses(self, keyword: str):
        # 过滤法语翻译中标题包含关键词的课程
        return Course.objects.translated('fr', title__icontains=keyword)

小提示

  • 确保你的Mixin能正确获取到Course实例,比如在基于类的视图里,通常可以通过self.object(详情页)或者遍历查询集来获取。
  • 如果在模板里使用Mixin传递的翻译内容,直接用变量即可,Parler已经处理好了语言适配。

内容的提问来源于stack exchange,提问作者Paddy Popeye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:11:13