Django动态模型创建。田地发生了冲突

2024-04-23 08:57:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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'.
....

Tags: nameappfieldmodeltitlemodelsruresult
2条回答

经过调查,我意识到,当我尝试使用函数创建模型时,我在field_type键中传递了类CharFieldinstance。 在for循环的函数create_language_dependent_model中,我将同一个实例分配给不同的模型字段 result_attrs[lang + "_" + attribute_name] = options.get('field_type')。在这种情况下,不同的字段引用同一个CharField实例,因此结果是字段冲突。解决方案是为每个字段创建CharField的新实例

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')

相关问题 更多 >