Czytanie dokumentacji Django:
get_user_model ()
Zamiast odwoływać się bezpośrednio do użytkownika, należy odwołać się do modelu użytkownika za pomocą django.contrib.auth.get_user_model (). Ta metoda zwróci aktualnie aktywny model użytkownika - niestandardowy model użytkownika, jeśli został określony, lub użytkownik w innym przypadku.
Podczas definiowania klucza obcego lub relacji wiele-do-wielu z modelem użytkownika, należy określić model niestandardowy za pomocą ustawienia AUTH_USER_MODEL.
Jestem zdezorientowany z powyższym tekstem. Powinienem to zrobić:
author = models.ForeignKey(settings.AUTH_USER_MODEL)
albo to...
author = models.ForeignKey(get_user_model())
Obie wydają się działać.
AUTH_USER_MODEL
ustawieniami w kodzie, które są wykonywane w czasie importu.get_user_model()
Działa tylko wtedy, gdy Django zaimportuje wszystkie modele”.get_user_model()
do używania atrybutów klasAUTH_USER_MODEL
?Nowość od Django 1.11.
Od Django 1.11 możesz używać
get_user_model()
w obu przypadkach! Więc jeśli nie chcesz się tym bardziej przejmować, po prostu weź to.„w obu przypadkach” oznacza: jeśli potrzebujesz modelu użytkownika, aby uzyskać dostęp do jego atrybutów, a także jeśli chcesz zdefiniować relację ForeignKey / ManyToMany.
Z dziennika zmian :
więc ... czy nadal jest powód do używania
settings.AUTH_USER_MODEL
? Cóż, dokumentacja nadal zalecasettings.AUTH_USER_MODEL
(który jest ciągiem znaków) do definiowania relacji, ale bez podawania wyraźnego powodu. Może być korzystny dla wydajności, ale nie wydaje się mieć większego znaczenia.Przykład kodu:
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! ... )
źródło
get_user_model()
można zadzwonić w czasie importu; jednak Django nadal radzi, aby użytkownicy definiowali relacje klucza obcego i wiele do wielu za pomocą AUTH_USER_MODELget_user_model
, szczególnie dla czytelników, którzy są zdezorientowani co do tego rozróżnienia)Od Django 1.11
get_user_model()
faktycznie używasettings.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 )
źródło
settings.AUTH_USER_MODEL zwraca ciąg (lokalizację modelu użytkownika), np. „user_accounts.User”
get_user_model () zwraca ACTUAL klasę modelu, a nie ciąg.
Więc w przypadkach, gdy potrzebujesz modelu User, użyj get_user_model (). Jeśli potrzebujesz jego lokalizacji (module.model jako ciąg znaków), użyj ustawień.AUTH_USER_MODEL.
źródło
Sposób na powrót do domyślnego 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)
źródło
AUTH_USER_MODEL
ma już wartość domyślną, więc zawsze będzie ustawiona.User
modelem jest model