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)