2009-09-17 5 views
6

私はDjangoの1.1で、このようなモデルをしました:デフォルトでは、私は両方とも「NULL」と「ブランク」虚偽であることを読んでいるmodel.CharField( 'blank = False')はsave()で動作しますか?

class Booking(models.Model): 
    name = models.CharField(max_length=100) 

だから、このようなテストで...

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.save() 

...私は例外をスローする保存予想しました。しかし、それはしません。空の名前(PostgresとSQLite3)で新しいレコードを作成することはとても嬉しいようです。

私は、管理インターフェイスを介して、実際には "このフィールドは必須"で保存が失敗することに注意してください。

質問は以下のとおりです。

  1. は唯一の形態で適用される「ブランク」属性ですか?
  2. 解決策は、save()メソッドをオーバーライドし、len(name)!= 0を明示的にチェックする修正ですか?
  3. 私は一度理解したことが私の誤解を解決するものを誤解しましたか? Django Docsから
+0

タイトルに対する回答は「いいえ」です。モデルで有効なデータを仮定し、検証をフォームに委ねるのが一般的な方法です。 –

+0

http://stackoverflow.com/questions/6940499/how-can-you-create-a-non-empty-charfield-in-django –

答えて

5

がUPDATE:最近Djangoのバージョンでmodel validation documentationを参照してみてください、これを説明するために

オリジナル回答blank=True/False only applies to forms。データ検証は現在、フォームレベルでのみ行われます。これはmodel-validation Google Summer of Code workがトランクにマージされると変わります。

モデルレイヤーで現在発生している唯一の種類の検証は、取得するデータを処理できない場合にデータベースのバックエンドがスローするエラーです。 CharFieldが空の場合、Djangoはデフォルトで空の文字列に設定されるため、データベースからエラーを受け取ることはありません。

今のところ、必要なモデルレベルの検証にはsave()メソッドを使用する必要があります。まもなく(あなたがトランク上にいる場合)、または1.2が出てくるときは、モデル検証のものを使います。

+1

これは古い答えのようですが、問題はまだ関連しているようですか?ここで何が起こったのか? – Lucretiel

+0

最近のスレッド:https://stackoverflow.com/questions/17816229 – texnic

1

「空の文字列の値は常に空の文字列としてではなく、NULLとして保存されますことに注意してくださいだけnullを使用=、整数、ブール値と日付などの非文字列フィールドのために真。 "

あなたのコードは空の文字列を格納しています。

class SimpleTest(TestCase): 
    def test_booking_save(self): 
     b = Booking() 
     b.name = None 
     b.save() 
+0

真実ですが、質問された質問には答えません。 –

+3

はい、実際には空の文字列を格納しています。それが問題です。 「空白」は「偽」に設定されているので、それを防ぐことが期待されます。 –

関連する問題