ユーニックス総合研究所

  • home
  • archives
  • django-booleanfield

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

  • 作成日: 2021-08-14
  • 更新日: 2023-12-26
  • カテゴリ: Django

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です。

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

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

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

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

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で検討してみてください。