2011-07-25 10 views
2

に空の文字列を許可しませんデフォルト。しかし、私の場合、私はxmlを解析し、そのようにモデルを作成しているので、私は全くフォームを使用していません。は、だから私は、次の属性を持つ本モデルを持つモデル属性

私は、空の文字列を許可しない設定ができますか、モデルフィールドを書き込むか、パーサーを調整する必要があるのでしょうか?

+3

フォームを使用してデータを検証し、モデルオブジェクトを作成することはできます。私は.xlsファイルを解析するときにその方法論を使用しました。フォームを使用すると、エラーをログに記録することもできます。 – Brandon

+0

それはあなたがそれから答えを出すべき素晴らしいヒントです。 – Pickels

+0

ありがとうございます。私はそれを答えとして加えました。 – Brandon

答えて

6

のModelFormを返すようあなたはまだ、データを検証し、モデルオブジェクトを作成するためのフォームを使用することができますなしに空の文字列であること作成するオブジェクト。私はその方法論を.xlsファイルからモデルへのバッチ更新を行う際に使用しました。

このようにフォームを使用すると、何がうまくいかなかったか、他のプロセスを開始するなど、エラーをログに記録することができます。

また、データベースを手作業で編集する必要がなくなり、文字列が空の場合でもフォームがデフォルト値にプラグインされる可能性があります。

あなたを助ける希望。

1

MySQLでは制約のサポートが制限されているため、トリガー(see here for more about how to use trigger)を使用するか、パーサーを調整する必要があります。

フィールド値としてNULLを持たなくても問題ないとすれば、モデルフィールドをnull=Falseに設定することができます(nullは純粋にデータベースに関連しますが、空白は検証に関連します)。そして、

if not variable: 
    variable = None 

この前のSOの質問にも役に立つかもしれません: I'm looking for a constraint to prevent the insert of an empty string in MySQL

-1

は[OK]を、ので、これは古い問題であり、DjangoのORM /モデル層はこれが頼まれた時にサポートを持っていなかったことは可能ですが、モデルのためのkwarg、あなたが望むものを正確に行いblankがあります:

class MyModel(models.Model): 
    text = models.CharField(max_length=255, null=False, blank=False) 

私は現在上記を使用しており、うまくいきます。私は、入力を事前に検証するというBrandonの答えは良いアイデアであり、このdb contraintでさえも行うべきであると指摘しておきます。私はちょうど余分なパラノイドであり、これは空白のテキスト値を持っています(私はおそらく、プログラマのエラーのために私は値なしで提出することができないので起こるだろうと思う)いくつかのものを壊してUIを完全に混乱させるだろう私はそれらを許可しません!

将来、誰かがこの投稿を遭遇したら、これが表示されることを願っています。

+1

これは正しくありません。 'blank'と' null'はデフォルトで両方とも 'False'なので、' title = models.CharField(max_length = 250) 'と同じです。 – YPCrumble

2

Djangoモデルのデフォルトはフォームの検証に適用されるblank=Falsenull=Falseです。つまり、データベースにNULLを含めることはできません。フォームを使用してモデルインスタンスをインスタンス化しないと、これらのどちらもデータベースに空の文字列を保存できなくなります。

フォームを使用せずにこれを行う良い方法(例:、あなたは)createまたはget_or_createを使用してクラスをインスタンス化しようとしている場合override the model's clean method and call full_clean in the save methodにある:あなたのケースでは

from django.core.exceptions import ValidationError 

    def clean(self): 
     if self.title == "": 
      raise ValidationError("Database should not contain an empty string title!") 

    def save(self): 
     self.full_clean() 
     super(YourModel, self).save(*args, **kwargs) 

あなたはおそらく同様にsave機能にあなたの検証を置くことができます。 cleanメソッドをオーバーライドし、保存メソッドでfull_cleanを呼び出す利点は、フォームnon_field_errorsValidationErrorが追加されることです。

関連する問題