7

継承モデルのMetaクラスのプロパティを使用して、継承ツリーの上位にある抽象モデルで定義されたフィールドを構成したいと思います。

class NamedModel(models.Model):
    class Meta:
        abstract = True
        verbose_name = 'object'

    name = models.CharField("Name",
        max_length=200,
        db_index=True,
        help_text="A meaningful name for this %s." % Meta.verbose_name)
        # see what I'm trying to do here?
    )
    ...

class OwnedModel(NamedModel):
    class Meta(NamedModel.Meta):
        verbose_name = 'owned object'

OwnedModelフォームの名前フィールドのヘルプテキストに「この所有オブジェクトの意味のある名前」と表示してほしい。ただし、そうではありません。「owned」という単語が欠落しています。これは、モデルのセットアップ時に、OwnedModel.Metaではなく、NamedModel.Metaのverbose_nameが使用されていることを示しています。

これは、継承の観点から私が期待していることではありません。Meta.verbose_nameがフィールドの抽象モデルではなく、非抽象モデルクラスの値を参照するようにフィールドを作成する方法はありますか。定義されましたか?

それとも私は気が狂っていますか?

(これは些細な例のように思えるかもしれませんが、それは次のとおりです。しかし、私がやろうとしているより重要で複雑なことの要点を説明するためだけのものです)

よろしくお願いします。

4

3 に答える 3

2

クラスを作ってみませんか。

class BaseNamedModelMeta:
    abstract = True
    verbose_name = "your text"

そして、次のように必要なものを継承してオーバーライドします。

class OwnedModel(NamedModel):
    class Meta(BaseNamedModelMeta):
        verbose_name = 'owned object'
于 2016-05-23T16:10:51.210 に答える
1

これは、クラスNamedModelが解析されるときに、Meta.verbose_nameが使用され、NamedModel.nameが作成されるために発生すると思います。したがって、後でクラスOwnedModelが解析されると、何も変更する機会がありません。

後でOwnedModel.nameにhelp_textプロパティを設定できるかもしれませんが、これによってNamedModel.nameも変更される可能性があります。

同様の状況で、変数パーツをモデルのクラス属性(メタではない)に配置し、実行時のメソッド/プロパティを使用して必要なテキストを生成しました。

于 2009-09-01T12:51:15.647 に答える
1

実際、私は次のことをすることになりました。基本モデルにはdynamic_field_definition()クラスメソッドが与えられます。これは、フィールドをパッチするために使用でき、cls引数は正しい(継承)クラスです。つまり、clsのメタ属性は、元のベースではなく、その正しい子のものです。

次に、そのメソッドを接続してclass_preparedシグナルで呼び出されるようにします。これにより、他の方法ですべての準備が整っていることがわかります。

class NamedModel(models.Model):
    ...
    @classmethod
    def dynamic_field_definition(cls):
        pass

def dynamic_field_definition(sender, **kwargs):
    if issubclass(sender, NamedModel):
        sender.dynamic_field_definition()
class_prepared.connect(dynamic_field_definition)

次に、モデルクラスによって異なるフィールドプロパティは、そのクラスメソッド(または派生クラスでオーバーライドされるメソッド)によって単純に再構成されます。

これは、Djangoモデルに最後の少しのOOネスをもたらすための少しハッキーな方法ですが、私の目的には問題なく機能します。

于 2009-09-01T15:40:27.303 に答える