2016-08-27 4 views
1

を提起していない私はモデルを持っている:私は試してみて、無入力で割引対象物​​を保存するときに私のシェルでジャンゴCharFieldですヌル= FalseのInegrityエラーが

class Discount(models.Model): 
    code = models.CharField(max_length=14, unique=True, null=False, blank=False) 
    email = models.EmailField(unique=True) 
    discount = models.IntegerField(default=10) 

、それはエラーは発生しません。私は間違って何をしていますか?

> e = Discount() 
> e.save() 
+0

あなたの代わりに 'Discount.objects.createを()'は何をすれば? – elethan

答えて

1

んが、デフォルトDjangoの動作はNullとしてCHARまたはTEXT種類を保存しません - それは常に空の文字列('')を使用します。 null=Falseは、これらのタイプのフィールドには影響しません。

blank=Falseは、モデルを使用してModelFormをレンダリングするときにフィールドがデフォルトで必要になることを意味します。この値を持たないモデルインスタンスを手動で保存することはできません。

あなたはここにしたいことはカスタムモデルのバリデータです:

from django.core.exceptions import ValidationError 
def validate_not_empty(value): 
    if value == '': 
     raise ValidationError('%(value)s is empty!'), params={'value':value}) 

は、その後、あなたのモデルにバリデータを追加します。これは、あなたが望むフォーム検証の世話をする

code = models.CharField(max_length=14, unique=True, validators=[validate_not_empty]) 

が、バリドンモデルインスタンスが保存されると自動的に実行されません。 Further reading here.インスタンスを保存するたびにこれを検証する場合は、デフォルトのsaveの動作を無効にし、そこに文字列の値をチェックし、必要に応じてエラーを発生させて保存を中断することをお勧めします。空の文字列値は常に空の文字列としてではなく、NULLとして保存されますので、そのようなCharFieldですとTextFieldなどの文字列ベースのフィールドにnullを使用してGood post on overriding save here.

Further reading on null:

は避けてください。文字列ベースのフィールドにnull = Trueが指定されている場合は、「データなし」の2つの値(NULLおよび空の文字列)があることを意味します。ほとんどの場合、「データなし」の2つの値を持つことは冗長ですが、DjangoではNULLではなく空の文字列を使用します。

And on validators.

関連する問題