1. ホーム
  2. python

[解決済み] djangoの抽象モデル vs 通常の継承

2023-01-31 18:58:59

質問

構文以外に、django の抽象モデルを使うことと、django のモデルで普通の Python 継承を使うことの違いは何ですか? 長所と短所は?

UPDATE: 私の質問が誤解されていたようで、抽象モデルと django.db.models.Model を継承したクラスの違いについて回答がありました。 私は実際に、django の抽象クラス (Meta: abstract = True) を継承するモデルクラスと、例えば 'object' (models.Model ではなく) を継承する普通の Python クラスの違いを知りたいのです。

以下はその例です。

class User(object):
   first_name = models.CharField(..

   def get_username(self):
       return self.username

class User(models.Model):
   first_name = models.CharField(...

   def get_username(self):
       return self.username

   class Meta:
       abstract = True

class Employee(User):
   title = models.CharField(...

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

<ブロッククオート

私は実際にモデルクラスの違いを知りたいです。 モデルクラスが django の抽象クラス (Meta: abstract = True) を継承しているのと を継承する Python クラスの違いを知りたいのです。 モデル.モデルではない)。

のサブクラスに対してのみ、Django はテーブルを生成します。 models.Model を生成するので、前者は...

class User(models.Model):
   first_name = models.CharField(max_length=255)

   def get_username(self):
       return self.username

   class Meta:
       abstract = True

class Employee(User):
   title = models.CharField(max_length=255)

...すると、次のような行程で1つのテーブルが生成されます...

CREATE TABLE myapp_employee
(
    id         INT          NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(255) NOT NULL,
    title      VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

...一方、後者は...

class User(object):
   first_name = models.CharField(max_length=255)

   def get_username(self):
       return self.username

class Employee(User):
   title = models.CharField(max_length=255)

...テーブルが生成されることはないでしょう。

多重継承を使えばこんなことも...。

class User(object):
   first_name = models.CharField(max_length=255)

   def get_username(self):
       return self.username

class Employee(User, models.Model):
   title = models.CharField(max_length=255)

...これはテーブルを作成しますが、これは User クラスで定義されたフィールドは無視されるので、最終的には以下のようなテーブルになります...

CREATE TABLE myapp_employee
(
    id         INT          NOT NULL AUTO_INCREMENT,
    title      VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);