Django makemigrations为未更改的模型字段创建新的迁移文件

时间:2015-09-19 07:28:48

标签: python django migration

我使用的内容如下,我已经定义了一个自定义的JSONField类型并为其添加了一个自定义验证器类。

models.py

json_ctn = JsonField(verbose_name=_('Json'), null=True, blank=True)

fields.py

class JsonField(models.TextField):

    def __init__(self, *args, **kwargs):

        if kwargs.get('validators'):
            kwargs['validators'].append(JsonValidator())
        else:
            kwargs.update({'validators': [JsonValidator()]})

        super(JsonField, self).__init__(*args, **kwargs)

    def __eq__(self, other):
        return True

validators.py

@deconstructible
class JsonValidator(object):

    error_messages = {
        'wrong_json_code': _('Provided custom value is not a valid JSON string.'),
    }

    def __call__(self, value):
        try:
            json.loads(value)
        except (ValueError, SyntaxError) as err:
            raise ValidationError(self.error_messages.get('wrong_json_code'))
        return value

    def __eq__(self, other):
        return True

问题在于我每次运行makemigrations,即使没有任何变化,也会创建一个包含以下内容的新迁移:

migrations.AlterField(
    model_name='whatever',
    name='json_ctn',
    field=PATH.fields.JsonField(blank=True, null=True, verbose_name='Json', validators=[PATH.validators.JsonValidator(), PATH.validators.JsonValidator(), PATH.validators.JsonValidator()]),
),
  1. 知道为什么这是行为?我甚至改变了_ eq _ 总是返回True,如上所述here
  2. 为什么JsonValidator()被添加3次 迁移文件中的验证器?
  3. 谢谢!

1 个答案:

答案 0 :(得分:2)

您将获得重复的条目,因为每次初始化字段时,您都会附加到同一列表中。最好将default_validators属性用作used in the docs。然后,您可以删除__init__方法。

class JsonField(models.TextField):
    default_validators = [validators.validate_slug]

希望这也将解决迁移问题。您可能需要在停止更改之前创建一个最终迁移(或重新创建添加了json字段的先前迁移)。