Django:控制台在CharField定义的字段上返回“值必须是十进制数字”吗?

时间:2019-05-03 19:52:15

标签: python django django-models

对.....所以我对此感到困惑。该错误所基于的代码功能是用户提交包含指定数据的csv文件。 Django将处理数据处理并将提交的数据添加到MySQL数据库。在调试一些处理错误并确保我所有定义的列表与csv文件标题顺序以及所有内容匹配时,Django的Model.save()函数将不起作用。因此,我打开了异常并打印到控制台,在此我将其作为错误:

编辑:将此值更新为实际错误结果值:

[u"'F1216-07a' value must be a decimal number."]

其中“ value1”是要输入到CharField定义的字段中的数据值。我的models.py文件都定义为字符串,而通过PHPMyAdmin的MySQL数据库表将此字段定义为char(N)。我想这是该领域的模型定义作为参考:

x_version = models.CharField(choices=X_VERSION_CHOICES, max_length=32, blank=True, verbose_name='By X Field Version')

这是选项的示例定义:

X_VERSION_CHOICES = (
    ('value1', 'value1'),
    ('value2', 'value2'),
)

此字段的值必须是预定义的字符串选择之一,因此没有任何选择将此值更改为Decimal值。当定义的类型正确时,为什么Django会显示此错误?是因为选择常量的定义方式?

编辑:我认为这是不言自明的问题,但这是model.Save()方法崩溃的位置的代码示例。

try:
     ....

     # Value in this reconciliation_required db field must be set as
     # "1" for true, which in test file it is.
     if contracts[line['contract_no']].reconciliation_required:

            # pass SampleDesignParameters the parameter dictionary and 
            # create line_parameters
            line_parameters = SampleDesignParameters(**para_dict)
            line_parameters.contract = contracts[line['contract_no']]
            line_parameters.name = 'Auto-Created'
            line_parameters.save()
            line_sample.parameters = line_parameters

 except Exception as e:
     print e
     # .... more code that generates warnings here

其中para_dict是一个字典,其中的键作为数据库的命名字段,其值是用户在该字段中输入的数据。我已经在控制台上打印了字典,因此对于键和数据字段,它们都相应地排列了起来。至于模型本身...

class SampleDesignParameters(DesignParameters):
    parent_template = models.ForeignKey('DesignParameters', related_name='parent', blank=True, null=True)

...

class DesignParameters(models.Model):
    id = models.AutoField(primary_key=True)
    ....

    # This field that Django has errors saving on:
    f1216_version = models.CharField(choices=F1216_VERSION_CHOICES, max_length=32, blank=True, verbose_name='BY ASTM F1216 VERSION')

....

该字段的适当常量,其格式与虚拟字段的格式几乎相同:

F1216_VERSION_CHOICES = (
    ('F1216-07a', 'F1216-07a'),
    ('F1216-09', 'F1216-09'),
)

1 个答案:

答案 0 :(得分:0)

最可能的解释是,该值以某种方式保存在模型的错误字段中。您可以捕获错误并检查值吗?或者,也许是一个可能的字段,并且CSV中可能有一个错误的行,缺少一个值,因此它们被移动了。