Python 为什么克隆FloatField的这个子类(添加了验证程序)会引发异常?
我不熟悉Python和Django 我希望我的模型具有经过范围验证的浮动。根据我写的:Python 为什么克隆FloatField的这个子类(添加了验证程序)会引发异常?,python,django,django-models,Python,Django,Django Models,我不熟悉Python和Django 我希望我的模型具有经过范围验证的浮动。根据我写的: class FloatRangeField (FloatField): """A FloatField constrained to a given range.""" def __init__ (self, minimum, maximum, **kwargs): minmax = [MinValueValidator (minimum), MaxValueValidat
class FloatRangeField (FloatField):
"""A FloatField constrained to a given range."""
def __init__ (self, minimum, maximum, **kwargs):
minmax = [MinValueValidator (minimum), MaxValueValidator (maximum)]
print ("\n\t\tFloatRangeField({},{})".format(minimum,maximum)) # (A)
FloatField.__init__ (self, validators = minmax, **kwargs)
print ("\t\tFINISHED\n")
这在python3 manage.py migrate
中导致了错误,我将其缩小为clone()
调用。演示:
print ("HERE 1")
tmp1 = FloatRangeField (10, 20)
print ("HERE 2")
tmp2 = FloatRangeField (10, 20)
print ("HERE 3")
tmp3 = tmp1.clone () # (B)
print ("HERE 4")
它从第#(B)
行抛出异常。奇怪的是,当这种情况发生时,第#(A)
行的跟踪没有打印出来。以下是输出:
HERE 1
FloatRangeField(10,20)
FINISHED
HERE 2
FloatRangeField(10,20)
FINISHED
HERE 3
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
utility.execute()
[...snip...]
tmp3 = tmp1.clone ()
File "/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py", line 470, in clone
return self.__class__(*args, **kwargs)
TypeError: __init__() missing 2 required positional arguments: 'minimum' and 'maximum'
为什么会出现这种情况?我应该如何实现FloatRangeField
,以封装最小/最大验证器的功能?类似的内容写在:
如果您添加一个新的关键字参数,您需要编写代码将其值放入kwargs
您自己(…)
所以你也应该添加解构器。这是必需的,例如,要在迁移文件中表示此字段:
class FloatRangeField (FloatField):
"""A FloatField constrained to a given range."""
def __init__ (self, minimum, maximum, **kwargs):
self.minimum = minimum
self.maximum = maximum
minmax = [MinValueValidator (minimum), MaxValueValidator (maximum)]
FloatField.__init__ (self, validators = minmax, **kwargs)
def deconstruct(self):
result = __, __, __, kwargs = super(FloatRangeField, self).deconstruct()
kwargs['minimum'] = self.minimum
kwargs['minimum'] = self.maximum
del kwargs['validators']
return result
因此,在这里我们在
解构(…)
函数中,我们删除了前两个验证器(我们在\uuuu init\uuuu(…)
函数中添加的验证器)。错误很明显:它无法克隆字段,因为缺少两个参数。
class FloatRangeField (FloatField):
"""A FloatField constrained to a given range."""
def __init__ (self, minimum, maximum, **kwargs):
self.minimum = minimum
self.maximum = maximum
minmax = [MinValueValidator (minimum), MaxValueValidator (maximum)]
FloatField.__init__ (self, validators = minmax, **kwargs)
def deconstruct(self):
result = __, __, __, kwargs = super(FloatRangeField, self).deconstruct()
kwargs['minimum'] = self.minimum
kwargs['minimum'] = self.maximum
del kwargs['validators']
return result
class FloatRangeField (FloatField):
"""A FloatField constrained to a given range."""
def __init__ (self, minimum, maximum, **kwargs):
self.minimum = minimum
self.maximum = maximum
old_validators = kwargs.get('validators', [])
minmax = [MinValueValidator (minimum), MaxValueValidator (maximum)]
kwargs['validators'] = minmax + old_validators
FloatField.__init__ (self, **kwargs)
def deconstruct(self):
result = __, __, __, kwargs = super(FloatRangeField, self).deconstruct()
kwargs['minimum'] = self.minimum
kwargs['minimum'] = self.maximum
kwargs['validators'] = kwargs['validators'][2:]
return result