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
モデルには、title
、body
、および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__()
メソッドもカスタマイズできます。これは、デバッガでオブジェクトを表示する際に使用されます。