2014-07-08 15 views
30

czytanie dokumentacji Django:Django przy użyciu get_user_model vs settings.AUTH_USER_MODEL

get_user_model()

Zamiast bezpośrednio odnoszące się do użytkownika, należy odwołać się do użytkownika modelu korzystania django.contrib.auth .get_user_model(). Ta metoda zwróci aktualnie aktywny model użytkownika - niestandardowy model użytkownika, jeśli określono opcję lub Użytkownik w przeciwnym razie.

Podczas definiowania klucza obcego lub relacji wielu do wielu do modelu użytkownika należy określić niestandardowy model przy użyciu ustawienia AUTH_USER_MODEL .

Jestem zmieszany z powyższym tekstem. Powinienem tego robić:

author = models.ForeignKey(settings.AUTH_USER_MODEL) 

czy to ...

author = models.ForeignKey(get_user_model()) 

Oba wydają się działać.

Odpowiedz

40
Korzystanie z settings.AUTH_USER_MODEL opóźni pobieranie rzeczywistej klasy modelu, dopóki wszystkie aplikacje nie zostaną załadowane. get_user_model spróbuje pobrać klasę modelu w momencie zaimportowania aplikacji po raz pierwszy.

get_user_model nie może zagwarantować, że model User został już załadowany do pamięci podręcznej aplikacji. Może działać w konkretnej konfiguracji, ale jest to scenariusz trafienia i braku. Jeśli zmienisz niektóre ustawienia (na przykład kolejność INSTALLED_APPS), może to spowodować przerwanie importu i będziesz musiał poświęcić więcej czasu na debugowanie.

przekaże ciąg jako model klucza obcego, a jeśli pobieranie klasy modelu zakończy się niepowodzeniem w momencie importowania tego klucza obcego, pobieranie będzie opóźnione, dopóki wszystkie klasy modeli nie zostaną załadowane do pamięci podręcznej.

+3

Konkretnie, można uruchomić w kwestii importu z okrągłymi models.ForeignKey (get_user_model()) –

+0

[Ta część docs] (https://docs.djangoproject.com/en/1.8/topics/auth/customizing/# referencing-the-user-model) mówi "Mówiąc ogólnie, powinieneś odwołać się do modelu użytkownika za pomocą ustawienia' AUTH_USER_MODEL' w kodzie, który jest wykonywany w czasie importu. 'get_user_model()' działa tylko raz Django zaimportował wszystkie modele. " –

+3

Tak więc, w funkcjach (widoki, modele/serializery/metody formularzy), użyj 'get_user_model()', dla atrybutów klas użyj 'AUTH_USER_MODEL'? –

-4

Sposób na awaryjne do standardowego modelu użytkownika, jeśli AUTH_USER_MODEL nie jest ustawiony:

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

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

'AUTH_USER_MODEL' ma już wartość domyślną, więc zawsze będzie ustawiona. – knbk

+2

ustawienia.AUTH_USER_MODEL jest również ciągiem znaków, a twoim zastępczym 'użytkownikiem' jest model – Matt

Powiązane problemy