2016-07-20 28 views
2

DjangoとREST Frameworkを使用して、AngularJS Webサイトにデータを提供するAPIを構築しています。すべての検証がバックエンドで行われるようにする必要があります。Django raise空のCharFieldsの例外

class Candidate(CreatedModel): 

    first_name = CharField(max_length=30) 
    last_name = CharField(max_length=100) 
    email = CharField(max_length=254, unique=True) 
    phone = CharField(max_length=20, null=True) 
    resume_path = CharField(max_length=200, null=True) 
    notes = TextField(null=True) 
モデルで

、唯一first_namelast_name、およびemail必要とされています

は私がモデルという名前の候補を持っています。残りのフィールドはnullでもかまいません。

次に、サーバーを実行し、新しい候補を作成するためのPOST POST要求を行います。問題は、たとえフィールドを指定しなくても、空の文字列値(0​​)を与えるだけです。

Django Model Fieldsのblank属性について聞いたことがありますが、フォームの検証にのみ適用され、HTTP要求には適用されません。

現在、私が問題を解決できると思われる唯一の方法は、BaseModelクラスのsave()関数をオーバーライドし、すべてのCharFieldが満たされているかどうか、またはそれ以外の場合はエラーを発生させることです。

思考?前もって感謝します!

+0

drfを使用している場合は、シリアル化でバリデーターを使用することができます。http://www.django-rest-framework.org/api-guide/validators/#optional-fields – jape

+0

私はあなたが100倍速くなると思いますPython EVEを使用している場合、REST APIを構築している場合は! –

+1

@japeありがとう!バリデーターを調べます! –

答えて

1

それが起こる理由は、ここで説明されています。空の文字列値は常に空 文字列としてではなく、NULLとして保存されますので、https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.Field.null

は、CharFieldですと のTextFieldなどの文字列ベースのフィールドにnullを使用しないでください。文字列ベースのフィールドがnull = Trueの場合、その は、 "データなし"の2つの値、つまりNULLと空の 文字列を持つことを意味します。ほとんどの場合、 "データなし"という2つの値を持つのは冗長ですが、DjangoではNULLではなく空の文字列を使用します。

空の文字列をデータベースに入れたくない場合は、フォームにrequiredというマークを付けるだけです。またはDRFを使用するvalidators

+0

お返事ありがとうございます!空の文字列値の戦略を変更することを検討します。私はDjangoフォームを使用していないので、 'required'を使うことはできません。 DRFバリデーターは役に立ちます。 –

+0

助けてくれてうれしい – e4c5

2

いくつかの調査の後、空の文字列がデータベースに保存されないようにする方法を見つけました。 CharFieldを継承し、empty_strings_allowedを上書きするカスタムDjango Fieldという名前のNonBlankCharFieldを作成しました。

class NonBlankCharField(CharField): 
    empty_strings_allowed = False 

は、その後、私はこのFieldの代わりCharFieldを使用しました。 NULLとは思われないFieldを指定しないと、IntegrityExceptionが発生します。

あなたは(モデル/ fields.pyファイルの内部)はDjangoのソースコードを見れば、それは示しています

def get_default(self): 
    """ 
    Returns the default value for this field. 
    """ 
    if self.has_default(): 
     if callable(self.default): 
      return self.default() 
     return self.default 
    if (not self.empty_strings_allowed or (self.null and 
       not connection.features.interprets_empty_strings_as_nulls)): 
     return None 
    return "" 

これはFieldは、そのデフォルト値を取得する方法です。 empty_strings_allowedCharFieldのデフォルトでTrueに設定されているため、FieldNoneとして保存してからExceptionを発生させます。

しかし、他の回答ではおそらく侵襲性の低いDRFバリデーターを使用することをお勧めします。私はそれを私の解決策の上で行います。

ありがとうございました。

関連する問題