django
class Menu(models.Model):parent_id = models.BigIntegerField(default=0, verbose_name='父菜单ID')name = models.CharField(max_length=50, verbose_name='菜单名称')icon = models.CharField(max_length=50, blank=True, null=True, verbose_name='菜单图标')path = models.CharField(max_length=100, blank=True, null=True, verbose_name='路由路径')component = models.CharField(max_length=100, blank=True, null=True, verbose_name='组件路径')sort = models.IntegerField(default=0, verbose_name='排序')visible = models.SmallIntegerField(default=1, verbose_name='是否显示')status = models.SmallIntegerField(default=1, verbose_name='状态')creator_id = models.BigIntegerField(blank=True, null=True, verbose_name='创建人ID')create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')is_deleted = models.SmallIntegerField(default=0, verbose_name='删除标志(0未删除,1删除)')class Meta:db_table = 'menus'verbose_name = '菜单'indexes = [models.Index(fields=['parent_id']),models.Index(fields=['sort']),models.Index(fields=['status']),]
像菜单模型直接将 name
字段写死在数据库中,是不支持国际化(i18n)的。如果你要做多语言系统,比如中英文切换,菜单名称就无法动态适配。
国际化菜单的常见方案
方案一:菜单名称只存“标识符”,前端根据语言包翻译(推荐)
name = models.CharField(max_length=50, verbose_name='菜单标识符') # 如 "menu.system.user"
然后前端使用语言包:
{"menu.system.user": "用户管理","menu.system.role": "角色管理"
}
优点:
菜单结构不变,语言切换只影响前端显示。
支持任意语言扩展。
前后端解耦,更灵活。
方案二:菜单表新增多语言字段(如 name_en、name_zh)
name_zh = models.CharField(max_length=50)
name_en = models.CharField(max_length=50)
然后后端根据用户语言返回对应字段。
优点:
后端控制显示语言,适合服务端渲染。
可用于导出、打印等场景。
缺点:
数据库字段膨胀,维护成本高。
每加一种语言就要加一列。
方案三:单独建一个菜单翻译表(menu_translations)
class MenuTranslation(models.Model):menu = models.ForeignKey(Menu, on_delete=models.CASCADE)lang = models.CharField(max_length=10) # 如 "zh", "en"name = models.CharField(max_length=50)
优点:
数据结构规范,支持无限语言。
可动态添加翻译,不改主表结构。
缺点:
查询时需要 join 或缓存。
实现稍复杂。
推荐做法(前后端分离项目)
✅ 菜单表只存标识符,前端用 i18n 语言包翻译 是最轻量、最灵活的方案。
你只需把菜单 name
改成:
name = models.CharField(max_length=50, verbose_name='菜单标识符') # 如 "menu.system.user"
然后前端 Vue 使用:
this.$t(menu.name) // 自动翻译
语言包结构:
{"menu.system.user": "用户管理","menu.system.role": "角色管理"
}