0

Django 1.4.3で次のことを試みました:

class The_Image_Abstract(models.Model):
    create_time = models.DateTimeField()
    class Meta:
        abstract = True

class Imager(The_Image_Abstract):
    time2 = models.DateTimeField()

class ImagerB(Imager):
    time3 = models.DateTimeField()

ただし、syncdb を実行すると、create_time フィールドが ImagerB のフィールドとして表示されません。それがどのように表示されるかについてのアイデアはありますか?それ以外の場合は、ImagerB で Imager からの一連のことを繰り返さなければなりません。

ありがとう、

時代

4

2 に答える 2

2

Imager または ImagerB に追加のフィールドがないと仮定すると、プロキシ モデルを使用できます。

これにより、基本クラス用に 1 つの db テーブルを保持し、Imager と ImagerB にデータを共有させることができます。実際には、適切なオブジェクト指向の継承のように機能します。問題は、子クラスに追加のフィールドを設定できないことです。ただし、少し柔軟性がある場合は、基本クラスでフィールドをオプションにしてから、子でフィールドを必須または非表示にすることができます。

アップデート

次のコードを機能させることはまだできていませんが、いくつかのアイデアが得られるかもしれません。

class TheImage(models.Model):
    create_time = models.DateTimeField()
    field2 = models.CharField(max_length=64, blank=True, null=True)
    field3 = models.TextField(blank=True, null=True)

class Imager(TheImage):
    class Meta:
        proxy = True

    def __init__(self, *args, **kwargs):
        for f in self._meta.fields:
            if f.name == 'field2':
                f.editable = False
            if f.name == 'field3':
                f.blank = False:
        super(Imager, self).__init__(*args, **kwargs)

class ImagerB(TheImage):
    class Meta:
        proxy = True

    def __init__(self, *args, **kwargs):
        for f in self._meta.fields:
            if f.name == 'field3':
                f.editable = False
            if f.name == 'field2':
                f.blank = False:
        super(ImagerB, self).__init__(*args, **kwargs)
于 2013-02-12T08:01:11.967 に答える
0

Imager表ではなく表示されますImagerB

Imagerは抽象クラスから継承されThe_Image_Abstractますが、独自のテーブルがあります。ImagerBは非抽象クラス から継承されているImagerため、 のフィールドはImagerのテーブルに配置されますImager

于 2013-02-12T05:41:57.027 に答える