0

フィールドを含む抽象モデルを設計しようとしています。サブクラス化されたモデルにはこのフィールドがありますが、さまざまなフィールド タイプになります。

class AbsModel(models.Model):
    data = models.??? #I want subclasses to choose this

    def __unicode__(self):
        return data.__str__()

    class Meta:
        abstract = True

class TimeModel(AbsModel):
    data = models.TimeField()
    ...

class CharModel(AbsModel):
    data = models.CharField(...)
    ...

データ フィールドの存在を強制する方法を探しているので、すべてのオブジェクトに対してUnicodeを 1 回記述することができます。

これが不可能な場合、スーパークラスのユニコードを呼び出すときにサブクラスの「データ」フィールドを参照するにはどうすればよいですか

この2番目の質問には、私が見逃している明らかな答えがあると感じています。

4

3 に答える 3

0

フィールドの型が models.Field であるスーパークラス フィールドをオーバーライドすることはできません。

https://docs.djangoproject.com/en/1.4/topics/db/models/#field-name-hiding-is-not-permitted

スーパークラスで別のタイプのフィールドを定義し、それを子でオーバーライドすることで、これを回避できます (おそらく__str__()、データ フィールドがオーバーライドされない場合に備えてメソッドを含めます)。

from django.db import models


class AbsDataField:
    def __str__(self):
        return "undefined"

class AbsModel(models.Model):
    data = AbsDataField

    def __unicode__(self):
        return self.data.__str__()

    class Meta:
        abstract = True

class TimeModel(AbsModel):
    data = models.TimeField()
    #...

class CharModel(AbsModel):
    data = models.CharField(max_length=32)
    #...
于 2012-06-01T08:58:41.663 に答える
0

Django でそれを行うことはできません:

通常の Python クラスの継承では、子クラスが親クラスの属性をオーバーライドすることが許可されています。Django では、これはFieldインスタンスである属性には許可されていません (少なくとも現時点では)。基本クラスに author というフィールドがある場合、その基本クラスから継承するクラスに author という別のモデル フィールドを作成することはできません。

親モデルのフィールドをオーバーライドすると、新しいインスタンスの初期化 (で初期化されるフィールドの指定Model.__init__) やシリアル化などの領域で問題が発生します。これらは、通常の Python クラスの継承ではまったく同じ方法で処理する必要がない機能であるため、Django モデルの継承と Python クラスの継承の違いは恣意的なものではありません。

[...]

FieldError祖先モデルのモデル フィールドをオーバーライドすると、Django は を発生させます。

于 2012-06-01T08:53:19.023 に答える
0

あなたはそのようなものを書くことができます:

class AbsModel(models.Model):
    def __unicode__(self):
        if hasattr(self, "data") and isinstance(self.data, models.Field):
            return data.__str__()
        return u"Unknown"
于 2012-06-01T08:46:51.683 に答える