22

モデルに便利/モデル メソッドを追加したいdjango.contrib.auth.models.User。前回チェックしたとき、 User モデルを拡張することは悪い習慣と見なされていたので、これを行うためのベストプラクティスは何ですか.

別のカスタムUserProfileモデルがあります。すべてのユーザー関連の便利なメソッドにそれを使用する必要がありますか?

4

5 に答える 5

30

モデルに何を追加しようとしているかによって異なります。ユーザーに関する情報を追加したい場合は、一般的に次のUserProfile方法を使用することをお勧めします: http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

ただし、モデルにカスタム メソッドまたはマネージャーを追加するだけの場合はUser、次のようにプロキシ モデルを使用する方がより論理的です。

from django.contrib.auth.models import User

class UserMethods(User):
  def custom_method(self):
    pass
  class Meta:
    proxy=True

プロキシ モデルは、元のモデルと同じデータベース テーブルで動作するため、モデルを物理的に拡張することなくカスタム メソッドを作成するのに理想的です。Userビュー内の への参照を に置き換えるだけUserMethodsです。(もちろん、モデルの登録を解除Userし、代わりにプロキシ モデルを登録することで、管理ツールでこれを使用できます。)

作成された元のモデルのインスタンスは、Userモデルを介して即座にアクセスでき、UserMethodsその逆も同様です。詳細はこちら: http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

(注: プロキシ モデルには Django 1.1 以降が必要です)

于 2009-11-30T12:17:53.657 に答える
14

User モデルにカスタム メソッドを追加する場合は、monkey_patchingをお勧めします。

::monkey_patching.pyのいずれかにファイルを作成しますapps

#app/monkey_patching.py
from django.contrib.auth.models import User 

def get_user_name(self):
    if self.first_name or self.last_name:
        return self.first_name + " " + self.last_name
    return self.username

User.add_to_class("get_user_name",get_user_name)

__init__.pyアプリのファイルにインポートします。すなわち::

#app/__init__.py
import monkey_patching
于 2014-07-10T03:54:16.033 に答える
4

はい。ユーザーモデルに .get_profile() 関数がアタッチされている場合、基盤をいじる必要はありません。

于 2009-11-30T07:06:24.977 に答える
3

2013 更新:

1.5 では、カスタム User モデルに置き換えて、必要なものを追加できますhttps://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user

于 2013-01-16T22:07:30.013 に答える
-1

私は、開発したさまざまなプロジェクトで同じ UserProfile を使用し、プロジェクト固有のニーズに合わせて User を拡張することを好みます。したがって、一般的な機能は UserProfile に移動し、プロジェクト固有の機能はカスタム ユーザーに移動します。サブクラス化された User モデルを使用することによる悪影響はまだありません。Django 1.0+ にはまだ存在するのでしょうか。

于 2009-11-30T07:58:58.350 に答える