2

何年にもわたる PHP プログラミングを経て、初めての実際の Django プロジェクトに取り組んでいますが、モデルに問題が発生しています。最初に、私はモデル間でコードをコピー アンド ペーストしていることに気付きました。熱心な OO プログラマーとして、他のモデルが継承できる親クラスを作成することにしました。

class Common(model.Model):
    name = models.CharField(max_length=255)
    date_created  = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.name

    class Meta:
        abstract=True

ここまでは順調ですね。現在、私の他のすべてのモデルは「Common」を拡張し、希望どおりの名前と日付を持っています。ただし、名前を一意にする必要がある「カテゴリ」のクラスがあります。Common から name 属性にアクセスして一意にする比較的簡単な方法があるはずだと思います。ただし、私が使用しようとしたさまざまな方法はすべて失敗しました。例えば:

class Category(Common):
    def __init__(self, *args, **kwargs):
        self.name.unique=True

Django 管理ページで、「レンダリング中に例外が発生しました: 'Category' オブジェクトに属性 'name' がありません」というエラーが吐き出されます。

誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

2

いいえ、Djangoはそれを許可していません。

ドキュメントを参照してください:http://docs.djangoproject.com/en/1.1/topics/db/models/#field-name-hiding-is-not-permitted

次のような他の質問にも回答しました:In Django-モデルの継承-親モデルの属性をオーバーライドできますか?

于 2010-05-26T16:40:19.340 に答える
1

あなたはCommonクラスで小さな間違いを犯しました

class Common(model.Model):
    self.name = models.CharField(max_length=255) 

する必要があります

class Common(model.Model):
    name = models.CharField(max_length=255)
于 2010-05-26T15:38:36.133 に答える
1

UNIQUE 制約は実際には Django とは何の関係もないので、データベース テーブルに自由に追加できることに注意してください。その目的でpost-syncdbフックを使用することもできます。

于 2010-05-26T23:11:05.757 に答える
0

Meta.unique_togetherを使用して、それを独自の一意のインデックスに強制してみてください。それができない場合は、2つの別々の抽象クラスを作成するのがおそらく最も簡単です。1つはフィールドが一意で、もう1つはそうではありません。

于 2010-05-26T16:45:15.213 に答える