Get_user_model ve ayarlar ile Django. AUTH_USER_MODEL


99

Django Belgelerini Okumak:

get_user_model ()

Doğrudan Kullanıcıya atıfta bulunmak yerine, django.contrib.auth.get_user_model () kullanarak kullanıcı modeline başvurmalısınız. Bu yöntem, o anda etkin olan Kullanıcı modelini - belirtilmişse özel Kullanıcı modelini veya aksi takdirde Kullanıcı'yı döndürür.

Kullanıcı modeline bir yabancı anahtar veya çoktan çoğa ilişkiler tanımladığınızda, AUTH_USER_MODEL ayarını kullanarak özel modeli belirtmelisiniz.

Yukarıdaki metinle kafam karıştı. Bunu yapmalı mıyım:

author = models.ForeignKey(settings.AUTH_USER_MODEL)

veya bu...

author = models.ForeignKey(get_user_model())

İkisi de işe yarıyor gibi görünüyor.

Yanıtlar:


89

Kullanımı settings.AUTH_USER_MODEL, tüm uygulamalar yüklenene kadar gerçek model sınıfının alınmasını geciktirir. get_user_modeluygulamanız ilk kez içe aktarıldığı anda model sınıfını almaya çalışacak.

get_user_modelUsermodelin uygulama önbelleğine zaten yüklendiğini garanti edemez . Özel kurulumunuzda işe yarayabilir, ancak bir vur-kaçır senaryosudur. Bazı ayarları değiştirirseniz (örneğin sırası INSTALLED_APPS), içe aktarmayı çok iyi kesebilir ve hata ayıklama için fazladan zaman harcamanız gerekecektir.

settings.AUTH_USER_MODEL yabancı anahtar modeli olarak bir dizge geçecektir ve bu yabancı anahtar içe aktarıldığında model sınıfının alınması başarısız olursa, alma tüm model sınıfları önbelleğe yüklenene kadar ertelenecektir.


7
Somut olarak, modellerle ilgili döngüsel içe aktarma sorunlarıyla karşılaşabilirsiniz.ForeignKey (get_user_model ())
Chris Clark

2
Belgelerin bu bölümünde "Genel olarak, AUTH_USER_MODELiçe aktarma zamanında yürütülen koddaki ayar ile Kullanıcı modeline get_user_model()başvurmalısınız . Yalnızca Django tüm modelleri içe aktardıktan sonra çalışır " der .
Hamish Downer

7
Yani somut olarak, işlevlerde (görünümler, model / serileştirici / form yöntemleri), get_user_model()sınıf öznitelikleri için kullanın AUTH_USER_MODEL?
Nick T

53

Django 1.11'den beri yeni.

Django 1.11'den beri get_user_model()her iki durumda da kullanabilirsiniz ! Bu yüzden, daha fazla uğraşmak istemiyorsanız, sadece alın.

"her iki durumda da" şu anlama gelir: özniteliklerine erişmek için kullanıcı modeline ihtiyacınız varsa ve ayrıca bir ForeignKey / ManyToMany-ilişkisi tanımlamak istiyorsanız.

Gönderen değişmek :

get_user_model (), modelleri tanımlayan modüllerde bile artık içe aktarma sırasında çağrılabilir.

yani ... kullanmak için hala bir sebep var settings.AUTH_USER_MODELmı? Dokümanlar settings.AUTH_USER_MODEL, ilişkileri tanımlamak için hala (bir dizedir) önerir , ancak açık bir neden belirtmez. Performans için faydalı olabilir, ancak pek önemli görünmüyor.

Kod örneği:

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()İçe aktarma sırasında çağrılabileceğini belirttiğiniz için teşekkür ederiz ; Bununla birlikte, Django hala kullanıcıların AUTH_USER_MODEL
çoktan çoğa

2
Bu tavsiyeye işaret ettiğiniz için teşekkür ederim, bir şekilde cevabı yazarken göz ardı ettim ama şimdi buldum. Bunu cevaba entegre etmeye çalıştım ( get_user_modelözellikle ayrım konusunda kafası karışık olan okuyucular için hala olumluydu )
Ilja

7

Django 1.11'den beri get_user_model()aslında settings.AUTH_USER_MODELşunları kullanıyor :

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 bir dize (Kullanıcı modelinin konumu) döndürür, örneğin 'user_accounts.User'

get_user_model () bir dize değil, ACTUAL model sınıfını döndürür.

Dolayısıyla, Kullanıcı modeline ihtiyaç duyduğunuz durumlarda get_user_model () kullanın. Konumuna ihtiyacınız varsa (bir dize olarak module.model), ayarları kullanın.AUTH_USER_MODEL.


-11

AUTH_USER_MODEL ayarlanmamışsa varsayılan kullanıcı modeline geri dönmenin bir yolu:

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

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

7
AUTH_USER_MODELzaten bir varsayılanı vardır, bu nedenle her zaman ayarlanacaktır.
knbk

4
settings.AUTH_USER_MODEL de bir dizedir ve yedeğiniz Userbir model
Mat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.