Django动态模型创建。战场正在发生冲突

时间:2016-03-19 11:13:37

标签: python django django-models

我正在使用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'.
....

2 个答案:

答案 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键中传递CharFieldfield_type。 在for循环中的函数create_language_dependent_model中,我将相同的实例分配给不同的模型字段 result_attrs[lang + "_" + attribute_name] = options.get('field_type')。在这种情况下,不同的字段引用CharField的同一个实例,因此在结果中我有字段冲突。解决方案是为每个字段

创建CharField的新实例