DjangoのBooleanFieldの使い方: 真偽値, True, False
- 作成日: 2021-08-14
- 更新日: 2023-12-26
- カテゴリ: Django
DjangoのBooleanFieldの使い方
Djangoには真偽値を扱うフィールド、その名もBooleanFieldがあります。
BooleanField
を使うと、モデルに真偽値を使ったフィールド、つまりFalse
かTrue
を持つフィールドを定義することが出来ます。
結論から言うとDjangoでBooleanField
を使ったモデルを定義するには↓のようにします。
from django.db import models
class Book(models.Model):
is_used = models.BooleanField(help_text='中古ならTrue')
この記事ではDjangoのBooleanField
について見ていきます。
具体的には↓の内容です。
- Boolean(真偽値)とは?
- 普通にBooleanFieldを使う
- デフォルト値を設定する
- 選択肢(choices)を設定する
- None(null)を許容するBooleanField
- BooleanFieldを参照する
- BooleanFieldでフィルタリングする
- DjangoのBooleanFieldの実装について
関連記事
DjangoのChoiceFieldのわかりやすい使い方・書き方
DjangoのDateTimeFieldの詳しい使い方: 日付と時刻を扱うフィールド
Boolean(真偽値)とは?
Booleanなバリューとはつまり真偽値のことを言います。
真偽値とは、真か偽かどちらかの値を取る値です。
真は英語ではTrue
(トゥルー)と呼ばれ、偽はFalse
(フォルス)と呼ばれます。
また数値では偽は0
で、真は0
以外になります。
真偽値はたとえば2択のようなものごとにうまく適合します。
たとえば新品か中古品か、どちらかの状態を取るオブジェクトがあったとします。
新品と中古品、どちらにTrue
とFalse
をあてがうのかは、この2つの状態を表す変数名によって変わります。
たとえばis_used
のような「中古品である」という意味の変数名では、True
が中古品、False
が新品になります。
いっぽう、is_new
のような「新品である」という意味の変数名では、True
が新品、False
が中古品になります。
is_used ... True = 中古品, False = 新品
is_new ... True = 新品, False = 中古品
どちらの変数名を使うかは開発者の設計によるでしょう。
真偽値はこのように状態を表す変数として使うことが出来ます。
普通にBooleanFieldを使う
普通にBooleanField
を使ってモデルを定義する場合は↓のようになります。
from django.db import models
class Book(models.Model):
is_used = models.BooleanField(help_text='中古ならTrue')
BooleanField
はdjango.db.models
からインポート可能です。
定義の際に必須となる引数はありません。
↑のようにフィールドの定義でdefault
引数が設定されていない場合、オブジェクトの作成ではis_used
の値の指定が必須になります。
book = Book.objects.create(is_used=False)
print(book.is_used)
# False
book = Book.objects.first()
print(type(book.is_used)) # <class 'bool'>
print(book.is_used) # False
デフォルト値を設定する
BooleanField
のデフォルト値を変更したい場合はdefault
引数にTrue
を設定します。
class Cloth(models.Model):
is_used = models.BooleanField(default=True, help_text='中古ならTrue')
↑のように定義したCloth
のis_used
はデフォルトでTrue
が保存されます。
↓のようにCloth.objects.create()
で作成した場合、is_used
はTrue
になります。
cloth = Cloth.objects.create()
print(cloth.is_used)
# True
選択肢(choices)を設定する
BooleanField
はデフォルトでは、管理サイト上の表示はチェックボタンになります。
未チェックがFalse
でチェック有りがTrue
です。
この表示を名前付きの選択肢にしたい場合は↓のようにchoices
を設定します。
class Camera(models.Model):
IS_USED_CHOICES = (
(False, '新品'),
(True, '中古'),
)
is_used = models.BooleanField(choices=IS_USED_CHOICES, help_text='中古ならTrue')
↑のようにBooleanField
のchoices
にIS_USED_CHOICES
を設定すると、管理サイト上では↓のような表示になります。
チェックボタンがプルダウンメニューになって、一見して新品か中古かわかりやすくなっています。
None(null)を許容するBooleanField
BooleanField
はFalse
とTrue
の2つの状態しかないと思いがちですが、実はもう1つ状態があります。
それがNone
です。
↓のようにフィールドを定義すると、フィールドの状態にNone
を持たせることが出来ます。
class Hat(models.Model):
is_used = models.BooleanField(null=True, blank=True, help_text='中古ならTrue')
↑のようなモデルでは、is_used
に値を設定しなくてもオブジェクトを保存することが出来ます。
そのため↓のようにNone
を参照することが出来ます。
hat = Hat.objects.first()
print(hat.is_used)
# None
BooleanFieldを参照する
オブジェクトのBooleanField
を参照するには↓のようにします。
book = Book.objects.first()
print(type(book.is_used)) # <class 'bool'>
print(book.is_used) # True
↑の例ではBook
オブジェクトを1つ取得して、そのBook
オブジェクトが持つis_used
フィールドを参照しています。
BooleanField
は↑のようにオブジェクトではbool
になります。
BooleanFieldでフィルタリングする
filter()
などを使ってBooleanField
でフィルタリングするにはたとえば↓のようになります。
used_books = Book.objects.filter(is_used=True).all()
print(used_books)
# <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
↑の場合、Book
を取得していますが、filter()
でis_used
がTrue
のオブジェクトのみ残る様にフィルタリングしているので、結果はすべて中古品(False
)のBook
になります。
DjangoのBooleanFieldの実装について
DjangoのBooleanField
の実装については↓から参照できます。
django/init.py at main · django/django
BooleanField
はField
クラスを継承したクラスです。
Field
はDjangoのモデルのフィールドのベースとなるフィールドです。
また、このField
を継承すればオリジナルのフィールドを作ることも可能です。
Field
はto_python()
というメソッドを持っていますが、これはフィールドの持つデータをPythonのオブジェクトに変換するメソッドです。
このto_python()
はフォームのバリデーション時に呼ばれるメソッドです。
BooleanField
はこのto_python()
を上書きして、フォーム(のフィールド)のバリデーションを行っています。
バリデーションではnull
に相当する値はNone
になります。
また、整数0
はFalse
になり整数1
はTrue
になります。
真偽値False
はFalse
で、真偽値True
はTrue
のままです。
値が文字列で't'
, 'True'
, '1'
のいずれかである場合はTrue
になります。
また'f'
, 'False'
, '0'
のいずれかであればFalse
になります。
バリデーションに失敗すると、django.core.exceptions.ValidationError
例外が発生します。
おわりに
今回はDjangoのBooleanField
について見てみました。
BooleanField
は比較的に良く使われるフィールドと言えます。
状態が2つある変数はBooleanField
で検討してみてください。