Django 外部キーで参照しているデータが”モデル名 object (XX)”と表示され困っている人へ

Djangoのモデル定義で下記「【Before】.models」のように外部キー(ForeignKey)を設定させ、テンプレートで{{ bar.bar }}と書いても「Bar object (XX)」と画面表示されて困っている方いらっしゃいませんでしょうか。

これはモデルクラスのスーパークラス(django.db.models.Model)にある__str__(self)関数の影響です。この関数が呼ばれると上記のような表記でクラスのstrを返してしまいます。したがって、この__str__str(self)を下記「【After】.models」にある赤字のように書いてDBの値のままのstr表記を返すようオーバーライドしてあげれば解消できます。

【Before】.models
class Foo(models.Model):
  foo = models.CharField(max_length=1)

class Bar(models.Model):
  bar = models.ForeignKey(Foo, on_delete=models.CASCADE)
  baz = models.CharField(max_length=10)

 

django.db.models.Model
def __str__(self): 
  return '%s object (%s)' % (self.__class__.__name__, self.pk)

 

【After】.models
class Foo(models.Model):
  foo = models.CharField(max_length=1)

  # Add
  def __str__(self):
    return self.foo

class Bar(models.Model):
  bar = models.ForeignKey(Foo, on_delete=models.CASCADE)
  baz = models.CharField(max_length=10)
sponsor