5

モデルの継承されたフィールドに、そのモデルの init 関数内からアクセスしたい -

class Parent(models.Model):
    parent_field = models.TextField(default="parent text")

    class Meta:
        abstract = True

class Child(Parent):

    def __init__(self, *args, **kwargs):
        super(Child, self).__init__(*args, **kwargs)
        self.parent_field.default="child text"

ただし、Child オブジェクトを初期化しようとするとself.parent_field(上記のコードで)、既にフィールド オブジェクトではなく Unicode オブジェクトになっています。

fields をオーバーライドするべきではないことはわかっています。メタクラスで何かをオーバーライドする必要があると思います。これを行う方法はありますか?それとも私が迷惑をかけているだけですか?

4

3 に答える 3

9

モデル データとモデル メタデータを混同しています。フィールドはメタデータに属します。それらは、データの読み込みと保存に使用されます。反対に、モデルのプロパティは常にデータです。そのため、self.parent_fieldは Unicode オブジェクトです。フィールド オブジェクトにアクセスするには、モデルのメタデータ、つまりself._metaオブジェクトにアクセスする必要があります (そこには からのすべてのものclass Metaも含まれます)。フィールドは、クラスに定義されたオブジェクトself._meta.fieldsのリストである にあります。django.models.Field

于 2013-02-16T15:29:36.600 に答える
2

以下のように使用_meta.get_fieldします。

class Child(Parent)
    def __init__(self, *args, **kwargs):
        super(Child, self).__init__(*args, **kwargs)
        self._meta.get_field('parent_field').default="child text"
于 2015-04-20T09:47:46.917 に答える
1

テスト済みで動作するコードでOK-

class Parent(models.Model):
    parent_field = models.TextField(default="parent default")

    class Meta:
        abstract = True


class Child(Parent):

    def __init__(self, *args, **kwargs):
        for f in self._meta.fields:
            if f.attname == "parent_field":
                f.default = "child default"
        super(Child, self).__init__(*args, **kwargs)

mderkに感謝します。

于 2013-02-16T16:35:37.237 に答える