特に、 128文字に制限された製品フィールドを含むDjangoモデルがあります。
class SKU(models.Model):
...
product = models.CharField(max_length=128, null=True, blank=False)
...
アプリのある時点で、いくつかのユーザー データを読み取り、それから SKU を作成して保存します。結局のところ、製品フィールドに入力されるデータが、指定されたサイズの 128 文字を超える場合があります。私のアプリが WSGI を介して Apache によって提供されている場合、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 が保存され、商品フィールドの内容が 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 によって提供される場合とで異なることを意味します。次の質問があります。
- これら 2 つのケース (Apache とテスト サーバー) で、Django はどのように異なる処理を行うのでしょうか?
- コードで明示的に示す方法はありますか: この sku を保存します。モデル定義に従ってフィールドを切り詰めても問題ありませんか?
- これを処理するより良い方法はありますか?
#3 について、モデルのフィールド定義を内省し、文字列を保存する前に手動で切り捨てることを想像できます。しかし、それは多くのことをいじっています。これを達成するための正面玄関の方法があると思いますが、見つかりません。