Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么克隆FloatField的这个子类(添加了验证程序)会引发异常?_Python_Django_Django Models - Fatal编程技术网

Python 为什么克隆FloatField的这个子类(添加了验证程序)会引发异常?

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

我不熟悉Python和Django

我希望我的模型具有经过范围验证的浮动。根据我写的:

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