Django 模型字段类型重新定义错误,而 syncDB
Django models field types redefine error while syncDB
我正在使用 Django 1.8.3。
为了一些简单的限制,我重新定义了一个 Field 类型。
class BigIntegerField(models.BigIntegerField):
def __init__(self, min_value=None, max_value=None, **kwargs):
validators=[MinValueValidator(min_value), MaxValueValidator(max_value)]
models.BigIntegerField.__init__(self, validators, **kwargs)
class Test(models.Model):
a = globalModels.BigIntegerField()
然后我执行了 syncDB,但它生成如下所示的异常。
Operations to perform:
Synchronize unmigrated apps: staticfiles, models, messages
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
No migrations to apply.
Traceback (most recent call last):
File "C:\Users\sangmin\Desktop\modelsTest\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 338, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 393, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 444, in execute
output = self.handle(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\syncdb.py", line 25, in handle
call_command("migrate", **options)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 120, in call_command
return command.execute(*args, **defaults)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 444, in execute
output = self.handle(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\migrate.py", line 205, in handle
ProjectState.from_apps(apps),
File "C:\Python27\lib\site-packages\django\db\migrations\state.py", line 178, in from_apps
model_state = ModelState.from_model(model)
File "C:\Python27\lib\site-packages\django\db\migrations\state.py", line 354, in from_model
e,
TypeError: Couldn't reconstruct field a on models.Test: __init__() got multiple values for keyword argument 'verbose_name'
哪里错了?
为了弄清楚 probem 是什么,我尝试删除了代码中的某些部分。
最后我发现,如果我删除 models.BigIntegerField.__init__(self, validators, **kwargs)
中的 validators
参数,它工作正常
任何字段 class 的第一个位置参数是 verbose_name,而不是验证器。您应该将其作为 kwarg 传递。 (另外,你真的应该使用 super())。
super(BigIntegerField, self).__init__(self, validators=validators, **kwargs)
我正在使用 Django 1.8.3。
为了一些简单的限制,我重新定义了一个 Field 类型。
class BigIntegerField(models.BigIntegerField):
def __init__(self, min_value=None, max_value=None, **kwargs):
validators=[MinValueValidator(min_value), MaxValueValidator(max_value)]
models.BigIntegerField.__init__(self, validators, **kwargs)
class Test(models.Model):
a = globalModels.BigIntegerField()
然后我执行了 syncDB,但它生成如下所示的异常。
Operations to perform:
Synchronize unmigrated apps: staticfiles, models, messages
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
No migrations to apply.
Traceback (most recent call last):
File "C:\Users\sangmin\Desktop\modelsTest\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 338, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 393, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 444, in execute
output = self.handle(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\syncdb.py", line 25, in handle
call_command("migrate", **options)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 120, in call_command
return command.execute(*args, **defaults)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 444, in execute
output = self.handle(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\migrate.py", line 205, in handle
ProjectState.from_apps(apps),
File "C:\Python27\lib\site-packages\django\db\migrations\state.py", line 178, in from_apps
model_state = ModelState.from_model(model)
File "C:\Python27\lib\site-packages\django\db\migrations\state.py", line 354, in from_model
e,
TypeError: Couldn't reconstruct field a on models.Test: __init__() got multiple values for keyword argument 'verbose_name'
哪里错了?
为了弄清楚 probem 是什么,我尝试删除了代码中的某些部分。
最后我发现,如果我删除 models.BigIntegerField.__init__(self, validators, **kwargs)
中的 validators
参数,它工作正常
任何字段 class 的第一个位置参数是 verbose_name,而不是验证器。您应该将其作为 kwarg 传递。 (另外,你真的应该使用 super())。
super(BigIntegerField, self).__init__(self, validators=validators, **kwargs)