2015-04-21 60 views
3

至少2個參數(1給出)這是我的models.py 我得到的初始化不夠一個說法高清我越來越__init __()承擔IntegerField

我知道有很多類似的問題,但我無法找到解決方案。

class ExpField(models.FloatField): 

    def __init__(self, *args, **kwargs): 
     # Have a default "default" set to 0. 
     if kwargs.get('default') is None: 
      kwargs['default'] = 0 

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


class LevelField(models.IntegerField): 

    def __init__(self, exp_field, *args, **kwargs): 
     # Have a default "default" set to 1. 
     if kwargs.get('default') is None: 
      kwargs['default'] = 1 

     self.exp_field = exp_field 

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

class Skills(models.Model): 
    attack_exp = ExpField() 
    attack = LevelField(exp_field=attack_exp) 

我越來越

TypeError: Couldn't reconstruct field attack on highscores.Skills: __init__() takes at least 2 arguments (1 given) 

不知道什麼是錯的。

這是完整的跟蹤

[22/04/15 05:31:12][Raghav's:Runescape]$ python manage.py makemigrations 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line 
    utility.execute() 
    File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 330, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 441, in execute 
    output = self.handle(*args, **options) 
    File "/Library/Python/2.7/site-packages/django/core/management/commands/makemigrations.py", line 99, in handle 
    ProjectState.from_apps(apps), 
    File "/Library/Python/2.7/site-packages/django/db/migrations/state.py", line 166, in from_apps 
    model_state = ModelState.from_model(model) 
    File "/Library/Python/2.7/site-packages/django/db/migrations/state.py", line 343, in from_model 
    e, 
TypeError: Couldn't reconstruct field attack on highscores.Skills: __init__() takes at least 2 arguments (1 given) 
+0

是壓痕這裏是否正確?您的'__init__'函數是否在類定義中縮進? –

回答

2

kwargs字典中刪除從構造函數的簽名位置exp_field參數,並得到現場:

class LevelField(models.IntegerField): 

    def __init__(self, *args, **kwargs): 
     if kwargs.get('default') is None: 
      kwargs['default'] = 1 
     self.exp_field = kwargs.pop('exp_field', None) 
     super(LevelField, self).__init__(*args, **kwargs) 
+0

太好了。這工作。 我做錯了什麼? – Pranav

+0

當django進行遷移時,它在內部調用沒有任何參數的字段構造函數。 – catavaran

+0

Ohk,所以我們必須用kwargs來傳遞我們的論點。好,非常感謝。 – Pranav