2015-09-19 86 views
1

我正在使用的是如下,我已經定義了一個自定義的JSONField類型並向它添加了一個自定義驗證器類。Django makemigrations爲未更改的模型字段創建新的遷移文件

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次到遷移文件中的 驗證器?

謝謝!

回答

2

您會得到重複的條目,因爲每次字段被初始化時您都追加到同一個列表中。最好使用default_validators屬性,因爲used in the docs。然後您可以刪除您的__init__方法。

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

希望這也能解決遷移問題。您可能需要在停止更改之前創建一個最終遷移(或重新創建添加了json字段的以前的遷移)。

相關問題