get_user_modelとsettings.AUTH_USER_MODELを使用したDjango


98

Djangoドキュメントを読む:

get_user_model()

Userを直接参照する代わりに、django.contrib.auth.get_user_model()を使用してユーザーモデルを参照する必要があります。このメソッドは、現在アクティブなユーザーモデル(指定されている場合はカスタムユーザーモデル、それ以外の場合はユーザー)を返します。

ユーザーモデルに対して外部キーまたは多対多の関係を定義する場合は、AUTH_USER_MODEL設定を使用してカスタムモデルを指定する必要があります。

私は上記のテキストと混同しています。私はこれを行う必要があります:

author = models.ForeignKey(settings.AUTH_USER_MODEL)

またはこれ...

author = models.ForeignKey(get_user_model())

どちらも機能しているようです。

回答:


87

を使用settings.AUTH_USER_MODELすると、すべてのアプリが読み込まれるまで、実際のモデルクラスの取得が遅れます。get_user_modelアプリが最初にインポートされた時点で、モデルクラスの取得を試みます。

get_user_modelUserモデルがすでにアプリのキャッシュに読み込まれていることを保証できません。特定の設定で機能する可能性がありますが、これは行き当たりばったりのシナリオです。一部の設定(順序などINSTALLED_APPS)を変更すると、インポートが中断する可能性があり、デバッグにさらに時間を費やす必要があります。

settings.AUTH_USER_MODEL は外部キーモデルとして文字列を渡します。この外部キーのインポート時にモデルクラスの取得が失敗した場合、すべてのモデルクラスがキャッシュにロードされるまで取得が遅延されます。


7
具体的には、models.ForeignKey(get_user_model())で循環インポートの問題が発生する可能性があります
Chris Clark

2
ドキュメントのこのセクションには、「一般的に、AUTH_USER_MODELインポート時に実行されるコードの設定でユーザーモデルを参照する必要がありますget_user_model()。Djangoがすべてのモデルをインポートした場合にのみ機能します。」
ハミッシュダウナー2015年

7
具体的には、関数(ビュー、モデル/シリアライザー/フォームメソッド)では、を使用しget_user_model()、クラス属性にはAUTH_USER_MODEL?を使用します。
ニックT

53

Django1.11以降の新機能。

Django 1.11以降get_user_model()、どちらの場合でも使用できます。ですから、それ以上気にしたくない場合は、それを取ってください。

「どちらの場合も」とは、属性にアクセスするためのユーザーモデルが必要な場合、およびForeignKey / ManyToMany-relationを定義する場合を意味します。

変更ログから:

get_user_model()は、モデルを定義するモジュールであっても、インポート時に呼び出すことができるようになりました。

だから...まだ使用する理由はありますsettings.AUTH_USER_MODELか?まあ、ドキュメントはまだsettings.AUTH_USER_MODEL関係を定義するために(文字列である)を推奨していますが、明確な理由はありません。パフォーマンスには有益かもしれませんが、それほど重要ではないようです。

コード例:

from django.db import models
from django.contrib.auth import get_user_model
...
    ...
    user = models.ForeignKey(
        get_user_model(),
        null=True, # explicitly set null, since it's required in django 2.x. - otherwise migrations will be incompatible later!
        ...
    )

get_user_model()インポート時に呼び出すことができることを指摘していただきありがとうございます。しかし、Djangoはまだユーザーが外部キーと使用して、多対多の関係を定義することを助言AUTH_USER_MODELを
kevins

2
この推薦を指摘してくれてありがとう、どういうわけか私は返信を書くときにそれを見落としていました、しかし今私はそれを見つけました。私は(まだ有利な答えにこれを統合しようとしたget_user_model、特に区別について混乱している読者のために、)
は、Ilja

7

Django 1.11以降、get_user_model()実際には以下を使用していますsettings.AUTH_USER_MODEL

def get_user_model():
    """
    Return the User model that is active in this project.
    """
    try:
        return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
    except ValueError:
        raise ImproperlyConfigured("AUTH_USER_MODEL must be of the form 'app_label.model_name'")
    except LookupError:
        raise ImproperlyConfigured(
            "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
        )

0

settings.AUTH_USER_MODELは、文字列(ユーザーモデルの場所)を返します(例: 'user_accounts.User')

get_user_model()は、文字列ではなく、実際のモデルクラスを返します。

したがって、ユーザーモデルが必要な場合は、get_user_model()を使用してください。その場所(文字列としてのmodule.model)が必要な場合は、settings.AUTH_USER_MODELを使用します。


-11

AUTH_USER_MODELが設定されていない場合に、デフォルトのユーザーモデルにフォールバックする方法:

from django.conf import settings
from django.contrib.auth.models import User

USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', User)

7
AUTH_USER_MODELすでにデフォルトが設定されているため、常に設定されます。
knbk 2016年

4
settings.AUTH_USER_MODELも文字列であり、フォールバックUserはモデルです
Matt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.