我正在使用python 3.3和Django 1.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'.
....
答案 0 :(得分:0)
是否可以选择向模型添加language
字段?
class Header(models.Model):
title = models.CharField(max_length=100)
subtitle = models.CharField(max_length=100)
language = models.CharField(max_length=2, default='en')
答案 1 :(得分:0)
经过调查,我意识到,当我尝试使用函数创建模型时,我会在instance
键中传递CharField
类field_type
。
在for循环中的函数create_language_dependent_model
中,我将相同的实例分配给不同的模型字段
result_attrs[lang + "_" + attribute_name] = options.get('field_type')
。在这种情况下,不同的字段引用CharField
的同一个实例,因此在结果中我有字段冲突。解决方案是为每个字段
CharField
的新实例