我有一个 Django 模型,其中包含限制为 128 个字符的产品字段:
class SKU(models.Model):
...
product = models.CharField(max_length=128, null=True, blank=False)
...
在应用程序的某一时刻,我读入了一些用户数据并从中制作了一个 SKU,然后保存。事实证明,有时进入产品字段的数据超过了 128 个字符的指定大小。当 Apache 通过 WSGI 为我的应用程序提供服务时,sku.save()命令会发出以下警告:
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/mysql/base.py:114: Warning: Data truncated for column 'product' at row 1
……但仅此而已,一个警告。sku 被保存,product字段的内容被截断为 128 个字符。但是,当我使用 Django 的内置测试服务器对此进行测试时,sku.save()命令会导致崩溃,并且会出现以下(缩写)堆栈跟踪:
File "/Library/WebServer/Documents/acdc_cmd/trunk/promotions/promo_parsers.py", line 467, in createKitsAndContents
theSKU.save()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/base.py", line 463, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
...
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 114, in execute
return self.cursor.execute(query, args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.6-intel.egg/MySQLdb/cursors.py", line 204, in execute
if not self._defer_warnings: self._warning_check()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.6-intel.egg/MySQLdb/cursors.py", line 117, in _warning_check
warn(w[-1], self.Warning, 3)
Warning: Data truncated for column 'product' at row 1
在这种情况下,sku.save()会使程序崩溃。这意味着导入操作的结果在测试服务器上和由 Apache 服务时是不同的。我有以下问题:
- 在这两个(Apache 与测试服务器)案例中,Django 如何做不同的事情?
- 有没有办法在我的代码中明确指出:保存这个sku,根据模型定义截断字段就可以了?
- 有没有更好的方法来处理这个?
Wrt #3,我可以想象自省模型的字段定义,并在尝试保存之前手动截断字符串;但这很麻烦。我怀疑有一种前门方法可以做到这一点,但我找不到。