জ্যাঙ্গো get_user_model বনাম সেটিংস ব্যবহার করে Uআউথ_ইউএস_মোডেল


99

জ্যাঙ্গো ডকুমেন্টেশন পড়া:

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())

দু'জনেই কাজ বলে মনে হচ্ছে।

উত্তর:


89

settings.AUTH_USER_MODELসমস্ত অ্যাপ্লিকেশন লোড না হওয়া অবধি ব্যবহার প্রকৃত মডেল শ্রেণির পুনরুদ্ধারে বিলম্বিত করবে। get_user_modelআপনার অ্যাপ্লিকেশনটি প্রথমবার আমদানি করা মুহুর্তে মডেল ক্লাসটি পুনরুদ্ধার করার চেষ্টা করবে।

get_user_modelUserমডেলটি ইতিমধ্যে অ্যাপ্লিকেশন ক্যাশে লোড হয়েছে এমন গ্যারান্টি দিতে পারে না । এটি আপনার নির্দিষ্ট সেটআপে কাজ করতে পারে তবে এটি হিট অ্যান্ড মিসের দৃশ্য। আপনি যদি কিছু সেটিংস পরিবর্তন করেন (উদাহরণস্বরূপ ক্রম INSTALLED_APPS) এটি আমদানিটি খুব ভালভাবে ভেঙে দিতে পারে এবং আপনাকে অতিরিক্ত সময় ডিবাগিং করতে হবে।

settings.AUTH_USER_MODEL বিদেশী কী মডেল হিসাবে একটি স্ট্রিং পাস করবে এবং এই বিদেশী কীটি আমদানির সময় যদি মডেল শ্রেণির পুনরুদ্ধার ব্যর্থ হয় তবে সমস্ত মডেল শ্রেণি ক্যাশে লোড না হওয়া পর্যন্ত পুনরুদ্ধারটি বিলম্বিত হবে।


7
কংক্রিটলিপি, আপনি মডেলগুলির সাথে বিজ্ঞপ্তি আমদানির বিষয়ে দৌড়াতে পারেন Fফোরইনকি (get_user_model ())
ক্রিস ক্লার্ক

4
দস্তাবেজের এই বিভাগটি বলছে "সাধারণভাবে বলতে গেলে, আপনার ব্যবহারকারীর মডেলটি AUTH_USER_MODELকোডের সেটিংয়ের সাথে উল্লেখ করা উচিত যা আমদানির সময় কার্যকর করা হয় get_user_model()only
হামিশ ডাউনার

7
এত দৃ concrete়ভাবে, ফাংশনে (মতামত, মডেল / সিরিয়ালাইজার / ফর্ম পদ্ধতি), get_user_model()বর্গ বৈশিষ্ট্য ব্যবহারের জন্য ব্যবহার করুন AUTH_USER_MODEL?
নিক টি

53

জ্যাঙ্গো 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()আমদানির সময় বলা যেতে পারে যে নির্দেশ করার জন্য ধন্যবাদ ; তবে জ্যাঙ্গো এখনও উপদেশ ব্যবহারকারীরা বিদেশী কী এবং অনেক সাথে অধিকের সম্পর্ক ব্যবহার সংজ্ঞায়িত AUTH_USER_MODEL
kevins

4
এই সুপারিশটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ, উত্তরটি লেখার সময় আমি কোনওভাবে এটিকে উপেক্ষা করেছি, তবে এখন এটি খুঁজে পেয়েছি। আমি এটি উত্তরে একীভূত করার চেষ্টা করেছি (এখনও পক্ষপাতী get_user_model, বিশেষত পাঠকদের জন্য যারা পার্থক্য সম্পর্কে বিভ্রান্ত)
ইলজা

7

জ্যাঙ্গো ১.১১, যেহেতু 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

সেটিংস.আউথ_ইউএস_মোডেল একটি স্ট্রিং (ব্যবহারকারীর মডেলের অবস্থান) প্রদান করে যেমন 'ইউজার_স্যাক্টস.ইউজার'

get_user_model () ACTUAL মডেল ক্লাসটি প্রদান করে, স্ট্রিংকে নয়।

সুতরাং যেখানে আপনার ব্যবহারকারীর মডেল প্রয়োজন সেখানে get_user_model () ব্যবহার করুন। আপনার যদি এটির অবস্থানের প্রয়োজন হয় (স্ট্রিং হিসাবে মডিউল.মোডেল), সেটিংসটি ব্যবহার করুন U 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
সেটিংস.আউথ_ইউএস_মোডেলও একটি স্ট্রিং এবং আপনার ফ্যালব্যাক Userএকটি মডেল
ম্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.