Django/Python不喜欢FloatField的None值

2024-04-19 06:53:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django中有一个Account类,具有一个interest_rate属性(对应于数据库中的account.interest_rate)。以下是interest_rate的声明:

interest_rate = models.FloatField(null=True, blank=True)

如果我这样做,它会起作用:

^{pr2}$

但如果我这么做,那就没用了:

account = Account()
account.interest_rate = None
account.save()

我得到这个错误:

Traceback (most recent call last):
  File "./import.py", line 18, in <module>
    cProfile.run('g.process()', 'prof')
  File "/usr/lib/python2.6/cProfile.py", line 29, in run
    prof = prof.run(statement)
  File "/usr/lib/python2.6/cProfile.py", line 135, in run
    return self.runctx(cmd, dict, dict)
  File "/usr/lib/python2.6/cProfile.py", line 140, in runctx
    exec cmd in globals, locals
  File "<string>", line 1, in <module>
  File "/home/jason/projects/mcifdjango/mcif/models/generic_import.py", line 34, in process
    Account.save_in_bulk(self.rows)
  File "/home/jason/projects/mcifdjango/mcif/models/account.py", line 45, in save_in_bulk
    cursor.execute(Account.bulk_insert_statement(rows))
  File "/usr/lib/pymodules/python2.6/django/db/backends/util.py", line 15, in execute
    return self.cursor.execute(sql, params)
  File "/usr/lib/pymodules/python2.6/django/db/backends/mysql/base.py", line 86, in execute
    return self.cursor.execute(query, args)
  File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 168, in execute
    if not self._defer_warnings: self._warning_check()
  File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 82, in _warning_check
    warn(w[-1], self.Warning, 3)
_mysql_exceptions.Warning: Data truncated for column 'interest_rate' at row 1

为什么不让我在一个可以为null的字段上保存一个null?我做错了吗?在


Tags: runinpyselfexecuteratelibusr
2条回答

mysql中的字段可以为空吗?在

我在过去创建一个模型时遇到过这个错误,当时我创建了一个字段,这个字段最初是不允许为null的,当时创建了表,后来又更改为允许它为null。由于mysql在最初的表创建中设置了null=false,因此即使django允许插入,它也会失败。在

为了解决这个问题,我会检查mysql中的表定义,如果字段为null=false,可以手动更改它,或者删除表(如果不关心数据),然后重新运行/管理.pysyncdb来重新创建表。在

如果使用south来管理模式迁移,那么可以创建一个新的模式迁移,然后运行它。在

如果mysql表实例没有显示null=false,那么它是另一种情况。在

更新: 我们发现mysql的列是可以为null的,所以我正在更新答案。在

我使用的是Django版本1.2.5,您使用哪个版本?在

我在我的系统中创建了模型。在

from django.db import models

#================================================================================
class Account(models.Model):
    interest_rate = models.FloatField(null=True, blank=True)

然后通过shell运行,对我有效。在

^{pr2}$

这是django的create语句。agra是我的应用程序名。在

$ python manage.py sql aggra
BEGIN;
CREATE TABLE `aggra_account` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `interest_rate` double precision
)
;
COMMIT;

这是mysql中我的表的样子。在

CREATE TABLE `aggra_account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `interest_rate` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

那看起来像你的吗?在

更新2 我们发现它看起来是一样的,并且使用的django和python版本大致相同。在

你的mysql版本是什么?在

你有什么SQL模式?我的是空的。在

mysql> show variables where Variable_name = 'sql_mode';
+       -+   -+
| Variable_name | Value |
+       -+   -+
| sql_mode      |       |
+       -+   -+
1 row in set (0.00 sec)

如果将其设置为严格,则需要将其更改为更宽松。在

http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html

另请参见。在

http://forums.mysql.com/read.php?11,132672,132693#msg-132693

我错误地构建了我的SQL查询,把空白字符串放在应该放null的地方。我修好了,现在一切正常。在

我正在构建一个如下所示的查询:

INSERT INTO account (interest_rate) values ('')

本来应该是这样的:

^{pr2}$

这两个版本在MySQL中都可以正常工作,但是Python/Django不喜欢前一个版本。在

相关问题 更多 >