3

:これは、 AbstractUserが存在する前に尋ねられました。これは、おそらく最近使用したいものです。

基本的に、デフォルトのDjangoUserクラスからデフォルトのメールフィールドを削除したいと思います...

class MyUser(User):
    field = models.CharField(max_length = 10)
    a = 'hello'
    def b(self):
        print 'world'

del User.email
del MyUser.email
del Myuser.field

これらはすべてAttributeErrorを与えます。正常に機能しますが、次の方法でメソッドまたは属性を削除します。

del MyUser.a
del MyUser.b

だから私はなぜこれがうまくいかないのか興味があります。これらのモデルフィールドはどのようなものですか?

私が試したもう1つのことは、MyUserでemail = Noneを作成して電子メールを上書きすることでしたが、それも機能しませんでした(そして少し醜いでしょう)。

前もって感謝します!

追伸:なぜだろうと思っているなら; アプリケーションに本当に必要なのは不思議なことですが、データベースに未使用の列がないのは良いことだと思います。PpsDjangoファイルを変更してユーザーから「email」を手動で削除したくありません。

編集:ここでのフォローアップの質問(同じことをしたい人のために)syncdbの前に、標準のDjangoモデルからフィールドを削除してください

4

2 に答える 2

7

ご存知のように、モデルフィールドは、実際にはクラス属性であるように見えますが、実際にはクラス属性ではありません。

モデルは、メタクラスを使った非常に巧妙ですが複雑なハッキングによって構築されます。モデルクラス定義が実行されると(そのmodels.pyが初めてインポートされるとき)、メタクラスはそのモデルのすべてのフィールド定義を実行し、contribute_to_classそれぞれのメソッドを呼び出します。これにより、実際のフィールドが新しいクラスの_meta.fieldsプロパティに配置されます。したがって、モデルクラス自体には、直接プロパティとしてのフィールドはありません。

次に、モデルインスタンスが実際にインスタンス化されると、Djangoはそのリストを取得し、コンストラクターへの引数またはフィールドによって提供されるデフォルト値のいずれかを使用して、新しいインスタンスの属性を直接設定します。したがって、インスタンスを介してアクセスされる値には、背後に実際のフィールドコードはありません。これは、単純なインスタンス属性です。

とにかく、これらすべての結果は、モデル定義からフィールドを削除するには、Model._meta.fieldsリストからフィールドを削除するだけでよいということです。

于 2011-11-23T22:59:22.357 に答える