我使用的是python3.3和django1.9。我需要在django模型中实现多语言支持,因此我决定创建重复的字段-例如:
class Header:
ua_title = models.CharField(max_length=100)
ru_title = models.CharField(max_length=100)
en_title = models.CharField(max_length=100)
ua_subtitle = models.CharField(max_length=100)
ru_subtitle = models.CharField(max_length=100)
en_subtitle = models.CharField(max_length=100)
我有很多这样的模型,有很多字段,所以我决定动态地创建它们。我写了下面的函数:
def create_language_dependent_model(model_name: str, attrs: dict) -> models.Model:
DEFAULT_LANGS = ('ua', 'ru', 'en')
result_attrs = {
'__module__': 'app.models'
}
for attribute_name, options in attrs.items():
if options.get('isLanguageDependent'):
for lang in DEFAULT_LANGS:
result_attrs[lang + "_" + attribute_name] = options.get('field_type')
else:
result_attrs[attribute_name] = options.get('field_type')
return type(
model_name, (models.Model,), result_attrs
)
我创建了这样一个模型:
Header = create_language_dependent_model("Header", {
attr_name: {'isLanguageDependent': True, 'field_type': models.CharField(max_length=100)}
for attr_name in ('title', 'subtitle')
})
但是,当我尝试运行makemigrations
时,会出现以下错误:
....
app.Header.ru_title: (models.E006) The field 'ru_title' clashes with the field 'ru_title' from model 'app.header'.
app.Header.ru_title: (models.E006) The field 'ru_title' clashes with the field 'ru_title' from model 'app.header'.
app.Header.en_title: (models.E006) The field 'en_title' clashes with the field 'en_title' from model 'app.header'.
app.Header.en_title: (models.E006) The field 'en_title' clashes with the field 'en_title' from model 'app.header'.
....
经过调查,我意识到,当我尝试使用函数创建模型时,我在
field_type
键中传递了类CharField
的instance
。 在for循环的函数create_language_dependent_model
中,我将同一个实例分配给不同的模型字段result_attrs[lang + "_" + attribute_name] = options.get('field_type')
。在这种情况下,不同的字段引用同一个CharField
实例,因此结果是字段冲突。解决方案是为每个字段创建CharField
的新实例将
language
字段添加到模型中是一个选项吗?你知道吗相关问题 更多 >
编程相关推荐