1. ホーム
  2. python

[解決済み] Djangoで - モデルの継承 - 親モデルの属性をオーバーライドすることはできますか?

2022-09-04 06:18:02

質問

これをやりたいと思っています。

class Place(models.Model):
   name = models.CharField(max_length=20)
   rating = models.DecimalField()

class LongNamedRestaurant(Place):  # Subclassing `Place`.
   name = models.CharField(max_length=255)  # Notice, I'm overriding `Place.name` to give it a longer length.
   food_type = models.CharField(max_length=25)

これは私が使いたいバージョンです(ただし、どんな提案でも歓迎します)。 http://docs.djangoproject.com/en/dev/topics/db/models/#id7

これは Django でサポートされていますか?もしそうでなければ、同様の結果を得る方法はありますか?

どのように解決するのですか?

更新された回答:コメントで指摘されたように、元の回答は質問に適切に答えていませんでした。確かに LongNamedRestaurant モデルだけがデータベースで作成されました。 Place は作成されませんでした。

解決策としては、quot;Place" を表す抽象的なモデルを作成することです。 AbstractPlace といった抽象的なモデルを作成し、それを継承することです。

class AbstractPlace(models.Model):
    name = models.CharField(max_length=20)
    rating = models.DecimalField()

    class Meta:
        abstract = True

class Place(AbstractPlace):
    pass

class LongNamedRestaurant(AbstractPlace):
    name = models.CharField(max_length=255)
    food_type = models.CharField(max_length=25)

マークもお読みください。 回答 彼はなぜ非抽象クラスから継承された属性を変更することができないかについて素晴らしい説明をしています。

(これは Django 1.10 から可能になったことに注意してください: Django 1.10 以前には、抽象クラスから継承された属性を変更することはできませんでした)。

オリジナルの答え

Django 1.10 以降 が使えるようになりました。 可能 ! 頼まれたことをやればいいんです。

class Place(models.Model):
    name = models.CharField(max_length=20)
    rating = models.DecimalField()

    class Meta:
        abstract = True

class LongNamedRestaurant(Place):  # Subclassing `Place`.
    name = models.CharField(max_length=255)  # Notice, I'm overriding `Place.name` to give it a longer length.
    food_type = models.CharField(max_length=25)