【问题标题】:Django makemigrations makes new migration files for unchanged model fieldsDjango makemigrations 为未更改的模型字段创建新的迁移文件
【发布时间】:2015-09-19 07:28:47
【问题描述】:

我使用的是如下,我定义了一个自定义的 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 次到 迁移文件中的验证器?

谢谢!

【问题讨论】:

    标签: python django migration


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 2014-12-24
      • 2018-09-09
      • 1970-01-01
      • 2014-11-19
      • 2018-03-22
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多