Django Model __str__() メソッド:モデルオブジェクトを文字列に変換


db.models.Model.__str__() メソッドは、Django モデルオブジェクトを文字列に変換するために使用されます。これは、モデルオブジェクトを print() 関数で出力したり、管理画面で表示したりする際に自動的に呼び出されます。

デフォルトの動作

デフォルトでは、__str__() メソッドはモデルオブジェクトのプライマリキーを返します。例えば、以下の Blog モデルの場合、

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()

__str__() メソッドは次のように動作します。

def __str__(self):
    return str(self.pk)

これは、以下の出力を生成します。

1
2
3

カスタマイズ

__str__() メソッドは、モデルオブジェクトに関するより有益な情報を返すようにカスタマイズできます。例えば、以下の方法で Blog モデルの __str__() メソッドをカスタマイズできます。

def __str__(self):
    return f"{self.title} ({self.pk})"
Blog Title 1 (1)
Blog Title 2 (2)
Blog Title 3 (3)

ヒント

  • モデルオブジェクトの状態に基づいて異なる文字列を返すことができます。
  • 文字列フォーマットオプションを使用して、出力を書式設定できます。
  • モデルオブジェクトの複数のフィールドを結合して文字列を生成できます。

以下の例は、Blog モデルの __str__() メソッドをさらにカスタマイズする方法を示しています。

def __str__(self):
    if self.is_published:
        return f"{self.title} (published)"
    else:
        return f"{self.title} (draft)"
Blog Title 1 (published)
Blog Title 2 (draft)
Blog Title 3 (published)


モデルクラス

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    is_published = models.BooleanField(default=False)

    def __str__(self):
        if self.is_published:
            return f"{self.title} (published)"
        else:
            return f"{self.title} (draft)"

管理画面

from django.contrib import admin

from .models import Blog

admin.site.register(Blog)
>>> from .models import Blog

>>> blog1 = Blog.objects.create(title="Blog Title 1", body="This is the body of blog 1.")
>>> blog2 = Blog.objects.create(title="Blog Title 2", body="This is the body of blog 2.", is_published=True)
>>> blog3 = Blog.objects.create(title="Blog Title 3", body="This is the body of blog 3.")

>>> print(blog1)
Blog Title 1 (1)

>>> print(blog2)
Blog Title 2 (published)

>>> print(blog3)
Blog Title 3 (draft)
  • コンソール出力には、Blog モデルオブジェクトの文字列表現が表示されます。
  • 管理画面には、Blog モデルのエントリが表示されます。
  • __str__() メソッドは、モデルオブジェクトを文字列に変換するためにカスタマイズされています。
  • Blog モデルには、titlebody、および is_published という 3 つのフィールドがあります。


モデルオブジェクトの複数のフィールドを結合する

モデルオブジェクトの複数のフィールドを結合して、より詳細な文字列を生成することができます。例えば、以下の方法で Blog モデルの __str__() メソッドをカスタマイズできます。

def __str__(self):
    return f"{self.title} by {self.author} ({self.pk})"
Blog Title 1 by John Doe (1)
Blog Title 2 by Jane Smith (2)
Blog Title 3 by Peter Jones (3)

文字列フォーマットオプションを使用して出力を書式設定する

文字列フォーマットオプションを使用して、__str__() メソッドの出力書式を設定することができます。例えば、以下の方法で Blog モデルの __str__() メソッドをカスタマイズできます。

def __str__(self):
    return f"Title: {self.title} (Author: {self.author}) [Published: {self.is_published}]"
Title: Blog Title 1 (Author: John Doe) [Published: True]
Title: Blog Title 2 (Author: Jane Smith) [Published: False]
Title: Blog Title 3 (Author: Peter Jones) [Published: True]

モデルオブジェクトの状態に基づいて異なる文字列を返す

モデルオブジェクトの状態に基づいて異なる文字列を返すことができます。例えば、以下の方法で Blog モデルの __str__() メソッドをカスタマイズできます。

def __str__(self):
    if self.is_published:
        return f"{self.title} (published)"
    else:
        return f"{self.title} (draft) - {self.created_at}"
Blog Title 1 (published)
Blog Title 2 (draft) - 2024-05-27 23:59:59.999999+00:00
Blog Title 3 (published)

カスタムロジックを使用する

より複雑なロジックが必要な場合は、カスタムロジックを使用して __str__() メソッドを実装することができます。例えば、以下の方法で Blog モデルの __str__() メソッドをカスタマイズできます。

def __str__(self):
    # カスタムロジックを使用して文字列を生成する
    return custom_str_generator(self)

この例では、custom_str_generator は、モデルオブジェクトに基づいて文字列を生成するカスタム関数です。

  • モデルオブジェクトの __unicode__() メソッドもカスタマイズできます。これは、Python 2 で使用されます。
  • モデルオブジェクトの __repr__() メソッドもカスタマイズできます。これは、デバッガでオブジェクトを表示する際に使用されます。