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": "角色管理"
}