【问题标题】:django 1.11 makemigration error with custom range field带有自定义范围字段的 django 1.11 makemigration 错误
【发布时间】:2017-05-18 14:15:34
【问题描述】:

在 djangosn-ps 我找到了一个 IntegerRangeField 的示例 (https://djangosnippets.org/snippets/3016/)

from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models


class IntegerRangeField(models.IntegerField):
    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        validators = []
        if isinstance(max_value, int):
            validators.append(MaxValueValidator(max_value))
        if isinstance(min_value, int):
            validators.append(MinValueValidator(min_value))
        models.IntegerField.__init__(
            self,
            verbose_name,
            name,
            validators=validators,
            **kwargs
        )

def formfield(self, **kwargs):
    defaults = {'min_value': self.min_value, 'max_value':self.max_value}
    defaults.update(kwargs)
    return super(IntegerRangeField, self).formfield(**defaults)

我的模特:

class MyModel (models.Model):
    .....
    automatic_logout_value = IntegerRangeField (min_value=5, max_value=1440, 
                               blank=True, null=True, default=30)

启动“python manage.py makemigrations”后出现错误:

c:\python34\lib\site-packages\django\db\migrations\state.py line 437, in from_model 
e,
TypeError: Couldn't reconstruct field automatic_logout_value on myApp.myModel:
__init__ () got multiple values for keyword 'validators'

知道代码有什么问题吗? 谢谢!

【问题讨论】:

  • 请缩进你的代码

标签: python django validation django-migrations


【解决方案1】:
class IntegerRangeField(models.IntegerField):
    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        models.IntegerField.__init__(self, *args, **kwargs)
        if isinstance(max_value, int):
            self.validators.append(MaxValueValidator(max_value))
        if isinstance(min_value, int):
            self.validators.append(MinValueValidator(min_value))

你能试试这个代码吗,希望对你有帮助

【讨论】:

    【解决方案2】:

    你必须从kwargs 弹出validators。默认情况下它是一个元组,因此您需要将其转换为列表,以便您可以附加项目。

    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        validators = list(kwargs.pop('validators'))
        ...
    

    【讨论】:

      猜你喜欢
      • 2011-10-28
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2018-07-11
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多