16

ユーザー オブジェクトをカスタム フィールドで拡張するには、Django ドキュメントではUserProfilesの使用を推奨しています。ただし、1年ほど前のこれに関する質問に対するこの回答によると:

モデル API での Django の継承コードのリファクタリング以来、django.contrib.auth.models.User の拡張もより適切に機能するようになりました。

また、このような記事では、ユーザー モデルをカスタム フィールドで拡張する方法と、利点 (.get_profile() ではなく、ユーザー オブジェクトから直接プロパティを取得する) について説明しています。

したがって、この問題についてコンセンサスがあるかどうか、またはどちらか一方を使用する理由があるかどうか疑問に思っていました。それとも、Django チームは現在何を考えているのでしょうか?

4

2 に答える 2

8

UserProfilesの使用に投票します。

いくつかのサードパーティ製アプリを使用しています。また、ユーザーへの外部キーは常に auth.models.User を指します。

例:

class Article(models.Model):
    user = models.ForeignKey('auth.User') # instead of your CustomUser
    text = ....

カスタム User モデル:

class CustomUser(User):
    timezone = models.CharField(max_length=50, default='Europe/London')

    # Use UserManager to get the create_user method, etc.
    objects = UserManager()

Article インスタンスを介して user フィールドにアクセスするとどうなるでしょうか? これにより例外が発生します。

u = a_article.user
u.timezone

AttributeError: 'User' object has no attribute 'timezone'

おそらく、これは問題ではなく、追加の DB クエリを避けたくないでしょう。しかし、私は get_profile 方法を使用します。

2013 年 5 月の更新

Django 1.5 以降、デフォルトの User モデルを拡張するか、完全にカスタマイズされたモデルに置き換えることができます。

2016年11月更新

上記のソリューションは廃止されました。wim からのコメントを参照してください。

于 2010-05-03T13:47:06.337 に答える
2

モデルの継承に関するこのブログ エントリでJames Bennettが述べていることは次のとおりです。

人々がサブクラスでやりたいと言っていることのおそらく 90% 以上は、代わりに関連するモデルを定義し、それを一意の外部キーにリンクすることによって、よりうまく達成できると私は賭けています。

したがって、最善の方法は、 Pinaxの一部のコンポーネントやdjango-profilesアプリ (元は同じ James Bennett によるもの)などの外部アプリを使用することだと思います。

于 2010-05-03T14:08:06.177 に答える