Django makemigrations 为未更改的模型字段制作新的迁移文件
Django makemigrations makes new migration files for unchanged model fields
我使用的是如下,我定义了一个自定义的 JSONField 类型并添加了一个自定义验证器class。
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
问题出在每次我 运行 进行迁移时,即使没有任何变化,也会创建一个包含以下内容的新迁移:
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()]),
),
- 知道为什么会这样吗?我什至将 _ eq _ 更改为
总是 return 正确,如前所述 here.
- 还有为什么 JsonValidator() 添加了 3 次到
迁移文件中的验证器?
谢谢!
您得到了重复的条目,因为每次初始化该字段时您都附加到同一个列表。最好使用 default_validators
属性,如 used in the docs。然后您可以删除 __init__
方法。
class JsonField(models.TextField):
default_validators = [validators.validate_slug]
希望这也能解决迁移问题。您可能需要在停止更改之前创建一个最终迁移(或重新创建添加了 json 字段的上一个迁移)。
我使用的是如下,我定义了一个自定义的 JSONField 类型并添加了一个自定义验证器class。
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
问题出在每次我 运行 进行迁移时,即使没有任何变化,也会创建一个包含以下内容的新迁移:
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()]),
),
- 知道为什么会这样吗?我什至将 _ eq _ 更改为 总是 return 正确,如前所述 here.
- 还有为什么 JsonValidator() 添加了 3 次到 迁移文件中的验证器?
谢谢!
您得到了重复的条目,因为每次初始化该字段时您都附加到同一个列表。最好使用 default_validators
属性,如 used in the docs。然后您可以删除 __init__
方法。
class JsonField(models.TextField):
default_validators = [validators.validate_slug]
希望这也能解决迁移问题。您可能需要在停止更改之前创建一个最终迁移(或重新创建添加了 json 字段的上一个迁移)。