Django का उपयोग get_user_model vs settings.AUTH_USER_MODEL


98

Django दस्तावेज़ीकरण पढ़ना:

get_user_model ()

सीधे उपयोगकर्ता को संदर्भित करने के बजाय, आपको 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_modelयह गारंटी नहीं दे सकता कि Userमॉडल पहले से ऐप कैश में लोड है। यह आपके विशिष्ट सेटअप में काम कर सकता है, लेकिन यह एक हिट-एंड-मिस परिदृश्य है। यदि आप कुछ सेटिंग्स बदलते हैं (उदाहरण के लिए INSTALLED_APPS) तो यह बहुत अच्छी तरह से आयात को तोड़ सकता है और आपको अतिरिक्त समय डिबगिंग खर्च करना होगा।

settings.AUTH_USER_MODEL विदेशी कुंजी मॉडल के रूप में एक स्ट्रिंग पास करेगा, और यदि मॉडल वर्ग की पुनर्प्राप्ति उस समय विफल हो जाती है जब यह विदेशी कुंजी आयात की जाती है, तो पुनर्प्राप्ति को तब तक विलंबित किया जाएगा जब तक कि सभी मॉडल कक्षाएं कैश में लोड न हो जाएं।


7
लगातार, आप मॉडल के साथ परिपत्र आयात के मुद्दों में भाग सकते हैं। ForeignKey (get_user_model ())
क्रिस क्लार्क

2
डॉक्स का यह खंड "आम तौर पर बोल रहा है, आपको उपयोगकर्ता मॉडल को AUTH_USER_MODELकोड में सेटिंग के साथ संदर्भित करना चाहिए जो आयात समय पर निष्पादित किया जाता है। get_user_model()केवल उसी समय काम करता है जब Django ने सभी मॉडल आयात किए हों।"
हामिश डाउनर

7
इसलिए, get_user_model()कक्षा विशेषताओं के उपयोग के लिए, कार्यों (विचारों, मॉडल / धारावाहिक / प्रपत्र विधियों) में उपयोग करें AUTH_USER_MODEL?
निक टी

53

Django 1.11 के बाद से नया।

Django 1.11 के बाद से आप get_user_model()दोनों मामलों में उपयोग कर सकते हैं ! इसलिए यदि आप इसके बारे में और परेशान नहीं करना चाहते हैं, तो बस इसे लें।

"दोनों मामलों में" का अर्थ है: यदि आपको इसकी विशेषताओं तक पहुंचने के लिए उपयोगकर्ता मॉडल की आवश्यकता है, साथ ही साथ यदि आप एक विदेशी / मानस्तंभ-संबंध को परिभाषित करना चाहते हैं।

से बदलाव का :

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, विशेष रूप से उन पाठकों के लिए जो भेद के बारे में भ्रमित हैं)
इलजा

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.Un'

get_user_model () ACTUAL मॉडल वर्ग लौटाता है, स्ट्रिंग नहीं।

तो ऐसे मामलों में जहां आपको उपयोगकर्ता मॉडल की आवश्यकता है, get_user_model () का उपयोग करें। यदि आपको इसकी आवश्यकता है (मॉड्यूल। स्ट्रिंग के रूप में मॉड्यूल), सेटिंग्स का उपयोग करें। 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

4
settings.AUTH_USER_MODEL भी एक स्ट्रिंग है और आपका कमबैक Userएक मॉडल है
मैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.