Django抽象模型集成django-simple-history与django-modeltranslation遇阻求助
Django集成django-simple-history与django-modeltranslation的问题解决思路
问题核心
你的场景是通过抽象BaseModel统一给子类添加历史追踪,但django-modeltranslation动态生成的翻译字段(如text_en)无法被django-simple-history识别——因为历史模型在翻译字段添加前就已创建。重复注册模型又会触发MultipleRegistrationsError。
可行解决方案
方案1:在翻译注册后重新注册历史(先取消原有注册)
在translation.py中,先完成模型翻译注册,再取消来自抽象基类的历史注册,最后重新注册模型以包含翻译字段:
from modeltranslation.translator import register, TranslationOptions import simple_history from test_app.models import TestModel @register(TestModel) class TestModelTranslationOptions(TranslationOptions): fields = ('text', 'new_text',) # 取消BaseModel中已注册的历史追踪 if hasattr(TestModel, 'history'): simple_history.unregister(TestModel) # 重新注册,此时翻译字段已被添加到模型中 simple_history.register(TestModel)
方案2:通过AppConfig控制注册时机
利用Django的AppConfig.ready()方法,确保在所有翻译字段加载完成后再处理历史注册:
- 修改
test_app/apps.py:
from django.apps import AppConfig class TestAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'test_app' def ready(self): import simple_history from .models import TestModel from modeltranslation.translator import translator # 确保翻译配置已加载 from .translation import TestModelTranslationOptions if not translator.is_registered(TestModel): translator.register(TestModel, TestModelTranslationOptions) # 重新注册历史追踪 if hasattr(TestModel, 'history'): simple_history.unregister(TestModel) simple_history.register(TestModel)
- 在
settings.py中确保使用自定义的AppConfig:
INSTALLED_APPS = [ # ... 'test_app.apps.TestAppConfig', # 替换原有的'test_app' ]
方案3:显式指定历史追踪的字段(适合固定语言场景)
如果你的项目语言固定,可以在子类中覆盖history字段,显式包含翻译后的字段:
from .base import BaseModel from simple_history.models import HistoricalRecords class TestModel(BaseModel): text = models.CharField(max_length=100) un = models.IntegerField() new_text = models.CharField(max_length=100) # 显式指定要追踪的字段,包含翻译字段 history = HistoricalRecords( fields=['text', 'text_en', 'new_text', 'new_text_en', 'un', 'created_at', 'updated_at'] )
这种方式无需调整注册顺序,但缺点是添加新语言时需要手动更新字段列表。
注意事项
- 无论使用哪种方案,修改后都需要重新生成迁移文件并执行迁移:
python manage.py makemigrations python manage.py migrate
- 若使用方案1或2,确保不要在多个地方重复注册历史追踪。
内容的提问来源于stack exchange,提问作者suliman awad
相关产品推荐
相关产品推荐

