DjangoのBooleanFieldの使い方: 真偽値, True, False

304, 2021-08-14

目次

DjangoのBooleanFieldの使い方

Djangoには真偽値を扱うフィールド、その名もBooleanFieldがあります。
BooleanFieldを使うと、モデルに真偽値を使ったフィールド、つまりFalseTrueを持つフィールドを定義することが出来ます。

結論から言うと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択のようなものごとにうまく適合します。
たとえば新品か中古品か、どちらかの状態を取るオブジェクトがあったとします。

新品と中古品、どちらにTrueFalseをあてがうのかは、この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')

BooleanFielddjango.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')

↑のように定義したClothis_usedはデフォルトでTrueが保存されます。
↓のようにCloth.objects.create()で作成した場合、is_usedTrueになります。

cloth = Cloth.objects.create()
print(cloth.is_used)
# True

選択肢(choices)を設定する

BooleanFieldはデフォルトでは、管理サイト上の表示はチェックボタンになります。
未チェックがFalseでチェック有りがTrueです。

book.png

この表示を名前付きの選択肢にしたい場合は↓のようにchoicesを設定します。

class Camera(models.Model):
    IS_USED_CHOICES = (
        (False, '新品'),
        (True, '中古'),
    )
    is_used = models.BooleanField(choices=IS_USED_CHOICES, help_text='中古ならTrue')

↑のようにBooleanFieldchoicesIS_USED_CHOICESを設定すると、管理サイト上では↓のような表示になります。

camera

チェックボタンがプルダウンメニューになって、一見して新品か中古かわかりやすくなっています。

None(null)を許容するBooleanField

BooleanFieldFalseTrueの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_usedTrueのオブジェクトのみ残る様にフィルタリングしているので、結果はすべて中古品(False)のBookになります。

DjangoのBooleanFieldの実装について

DjangoのBooleanFieldの実装については↓から参照できます。

django/init.py at main · django/django

BooleanFieldFieldクラスを継承したクラスです。
FieldはDjangoのモデルのフィールドのベースとなるフィールドです。
また、このFieldを継承すればオリジナルのフィールドを作ることも可能です。

Fieldto_python()というメソッドを持っていますが、これはフィールドの持つデータをPythonのオブジェクトに変換するメソッドです。
このto_python()はフォームのバリデーション時に呼ばれるメソッドです。
BooleanFieldはこのto_python()を上書きして、フォーム(のフィールド)のバリデーションを行っています。

バリデーションではnullに相当する値はNoneになります。
また、整数0Falseになり整数1Trueになります。
真偽値FalseFalseで、真偽値TrueTrueのままです。

値が文字列で't', 'True', '1'のいずれかである場合はTrueになります。
また'f', 'False', '0'のいずれかであればFalseになります。

バリデーションに失敗すると、django.core.exceptions.ValidationError例外が発生します。

おわりに

今回はDjangoのBooleanFieldについて見てみました。
BooleanFieldは比較的に良く使われるフィールドと言えます。
状態が2つある変数はBooleanFieldで検討してみてください。

左か右かはっきりさせようミ〇ー

真偽値(シンイ〇)・・・