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表記を返すようオーバーライドしてあげれば解消できます。
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)
def __str__(self):
return ‘%s object (%s)’ % (self.__class__.__name__, self.pk)
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)