[Django] models.pyに記述されたdef __str__(self)とは?
Djangoのチュートリアルなどを見ているとmodels.pyにdef __str__(self)の記述があります。
これってどういう意味なんでしょう?なくても問題なく動作しますし、記述する意味は?と思った人向けの記事になります。
Djangoのdef __str__(self)とは?
簡潔に述べると、
管理画面などで表示される文字列を定義
しているものになります。
ここでカテゴリモデルをmodels.pyで定義しているものとします。
class Category(models.Model): category = models.CharField(max_length=40) def __str__(self): return self.category
ここではdef __str__(self)を記述しています。selfというのはオブジェクト自身を指します。
で、この記述の時にはadminの管理画面に登録したカテゴリ名で表示されます。
では次にdef __str__(self)を削除してみます。もちろん、削除しても動くことは動きます。
しかし、管理画面が一部変化します。
クラスを文字列で定義するメソッドを削除したので、設定したカテゴリ名が表示されていませんね。
管理画面など様々な場面でモデルで定義したものが文字列で表示されないとものすごく不便です。
例えば、PostモデルとCategoryモデルをリレーション(1対多)で設定した時にPostの管理画面でカテゴリを選択します。
しかし、def __str__(self):を設定しないとクラスが文字列で表示されないので・・・
def __str__(self)メソッドを定義し、カテゴリ名の属性をリターンしてやると見やすくなります。
ちなみに、DjangoのチュートリアルであるDjangoGirlsではPostモデルのタイトルを表示するように設定されています。
class Post(models.Model): author = models.ForeignKey('auth.User', on_delete=models.CASCADE) # 追加分 category = models.ForeignKey(Category, verbose_name='カテゴリ', on_delete=models.PROTECT,) title = models.CharField(max_length=40) text = models.TextField() created_date = models.DateTimeField( default=timezone.now) published_date = models.DateTimeField( blank=True, null=True) def publish(self): self.published_date = timezone.now() self.save() def __str__(self): return self.title
ここではPostクラスごとに定義されたtitle属性、つまりは記事のタイトル名を管理画面で表示することになります。
teratailでまさに同じ質問がされていますが、2番目の回答が明快で分かりやすいです。
https://teratail.com/questions/87692#reply-137163