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

Django多语言配置后执行makemigrations报错:Category无'n'字段

Django多语言配置报错:Category has no field named 'n'

问题场景

为Django项目添加3种语言支持,已完成settings.py和urls.py的配置修改,但执行makemigrations命令时触发以下错误:

django.core.exceptions.FieldDoesNotExist: Category has no field named 'n'

项目Models代码

from django.urls import reverse
from django.db import models
from django.utils.text import slugify
from ckeditor_uploader.fields import RichTextUploadingField
# Create your models here.

class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=True)
    
    class Meta:
        abstract = True
        
class Category(BaseModel):
    name = models.CharField(max_length=255)
    slug = models.SlugField(null=True, blank=True)
    
    def __str__(self):
        return self.name
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name, allow_unicode=True)
        return super().save(*args, **kwargs)
    
    def get_absolute_url(self):
        return reverse('category_articles', args=[self.slug])
    
class Tag(BaseModel):
    name = models.CharField(max_length=255)
    
    def __str__(self):
        return self.name
    
class Article(BaseModel):
    title = models.CharField(max_length=255, unique=True)
    slug = models.SlugField(null=True, blank=True)
    subtitle = models.CharField(max_length=255)
    image = models.FileField(upload_to="articles")
    description = RichTextUploadingField()
    views = models.PositiveIntegerField(default=0)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="articles")
    tags = models.ManyToManyField(Tag, related_name="articles", null=True)
    
    def __str__(self):
        return f" {self.id} {self.title}"
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title, allow_unicode=True)
        return super().save(*args, **kwargs)
    
class Contact(BaseModel):
    name = models.CharField(max_length=255)
    email = models.EmailField()
    message = models.TextField()
    
    def __str__(self):
        return self.name

完整报错栈

Traceback (most recent call last):
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\db\models\options.py", line 681, in get_field
   return self.fields_map[field_name]
KeyError: 'n'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
 File "D:\OrderProjects\Omonatstyle\manage.py", line 22, in <module>
   main()
 File "D:\OrderProjects\Omonatstyle\manage.py", line 18, in main
   execute_from_command_line(sys.argv)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line
   utility.execute()
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\core\management\__init__.py", line 416, in execute
   django.setup()
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\__init__.py", line 24, in setup
   apps.populate(settings.INSTALLED_APPS)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\apps\registry.py", line 124, in populate
   app_config.ready()
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\apps.py", line 11, in ready
   handle_translation_registrations()
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\models.py", line 82, in handle_translation_registrations
   autodiscover()
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\models.py", line 28, in autodiscover
   import_module(module)
 File "C:\Users\SWORD\AppData\Local\Programs\Python\Python310\lib\importlib\__init__.py", line 126, in import_module
   return _bootstrap._gcd_import(name[level:], package, level)
 File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
 File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
 File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
 File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
 File "<frozen importlib._bootstrap_external>", line 883, in exec_module
 File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
 File "D:\OrderProjects\Omonatstyle\news\translation.py", line 5, in <module>
   class CategoryTranslationOptions(TranslationOptions):
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\decorators.py", line 35, in wrapper
   translator.register(model_or_iterable, opts_class, **options)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 538, in register
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model
   self._register_single_model(model, opts)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model
   self._register_single_model(model, opts)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
   self._register_single_model(model, opts)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model
   add_translation_fields(model, opts)
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 199, in add_translation_fields
   translation_field = create_translation_field(
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\fields.py", line 79, in create_translation_field
   field = cast(fields.Field, model._meta.get_field(field_name))
 File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\db\models\options.py", line 683, in get_field
   raise FieldDoesNotExist(
django.core.exceptions.FieldDoesNotExist: Category has no field named 'n'

问题原因

从报错栈可以定位到错误来自news/translation.py第5行的CategoryTranslationOptions类,说明多语言翻译配置中指定了不存在的字段名n,大概率是以下两种情况:

  • 拼写错误:把Category模型中的name字段误写成了n;
  • 语法错误:配置fields时的语法错误,例如字段名被错误拆分(比如换行时引号未正确闭合,导致解析出单个字符n)。

解决方案

  1. 打开news/translation.py文件,检查CategoryTranslationOptions类的fields配置,确保字段名与Category模型中的字段完全一致;
  2. 正确的配置示例如下:
from modeltranslation.translator import register, TranslationOptions
from .models import Category

@register(Category)
class CategoryTranslationOptions(TranslationOptions):
    fields = ('name', 'slug')  # 这里的字段名必须和models.py中的字段完全匹配
  1. 检查其他模型的翻译配置,避免出现类似的拼写或语法错误;
  2. 修正配置后,重新执行命令:
python manage.py makemigrations
python manage.py migrate

内容的提问来源于stack exchange,提问作者Jakhongir Abdikayumov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:02:03