空の値をIntegerfieldとして保存する方法 質問する

空の値をIntegerfieldとして保存する方法 質問する

同様のスレッドをすべて確認し、ドキュメントを読み、IntegerFieldデータベースに空の値を保存するためにさまざまな組み合わせを試しましたが、毎回失敗しました。

私はMySQLを使用しています。

フィールドをmodels.py定義しますage=models.IntegerField()。csv ファイルからデータベースにデータを入力すると、一部のセルに値がありません。Django のドキュメントには次のように書かれています:

Field.null

If True, Django will store empty values as NULL in the database. Default is False.
Note that empty string values will always get stored as empty strings, not as NULL. 

私が作業しているのは、IntegerField空の文字列 (csv の空のセル) を db 内に格納することです。したがって、フィールドにNULL追加する必要があると思います。実際、私はこれ以外にもいろいろ試しました:null=Trueage

age=models.IntegerField()
age=models.IntegerField(null=True)
age=models.IntegerField(null=True, blank=True)
age=models.IntegerField(null=True, blank=True, default=None)

そして、DBに空の文字列を挿入するたびに、

ValueError: invalid literal for int() with base 10: ''

他に何ができると思いますか?

ベストアンサー1

文字列は整数ではありません。また、空白の文字列はNoneまたは ではありませんNULL。必要なのは、フィールドが空白のインスタンスをキャッチして にキャストすることですNone

foo = "something" # "something" is coming from your CSV file

try:
   val = int(foo)
except ValueError:
   # foo is something that cannot be converted to
   # a number. It could be an empty string, or a
   # string like 'hello'
   # provide a default value
   val = None

# Now use val to insert into the database
f = MyModel()
f.age = val
f.save()

blankフロントエンドの検証のみを目的としており、データベース側には影響しません。

これは とは異なることに注意してくださいnullnullは純粋にデータベース関連ですが、blankは検証関連です。 フィールドに がある場合blank=True、フォーム検証では空の値の入力が許可されます。 フィールドに がある場合blank=False、フィールドは必須になります。

null一方、データベースに関係します:

True の場合、Django は空の値を NULL としてデータベースに保存します。デフォルトは False です。

IntegerFieldは整数に変換できる値を必要とするので、空白文字列の場合、キャストできず、例外が発生します。代わりに、 を渡しNone、 がある場合はage = models.IntegerField(null=True)、それを正しく格納することが認識されます。

要約する:

  • age = models.IntegerField()

    Noneフィールドは必須であり、有効な整数値が必要です。データベースでは null 値は受け入れられず、null 値も存在しません。有効な値は -2147483648 から 2147483647 です。

  • age = models.IntegerField(null=True)

    フィールドは必須です (フォーム検証)。フィールドNoneに値がある場合、NULLデータベース内でその値が変換されます。

  • age = models.IntegerField(blank=True, null=True)

    フィールドは必須ではありません(フォーム検証)。フィールドが渡された場合None、次のように変換されます。NULL

  • age = models.IntegerField(blank=True)

    フィールドは必須ではありません (フォーム検証) が、データベースは null を受け入れないため、有効な整数値を渡す必要があります。通常、ここではデフォルト値を指定するかdefault=0、値を orm に送信する前に何らかの検証を実行します。

おすすめ記事