Django โดยใช้ get_user_model เทียบกับการตั้งค่า AUTH_USER_MODEL


99

การอ่านเอกสาร 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())

ทั้งสองดูเหมือนจะได้ผล

คำตอบ:


89

การใช้settings.AUTH_USER_MODELจะทำให้การดึงคลาสโมเดลจริงล่าช้าออกไปจนกว่าจะโหลดแอพทั้งหมด get_user_modelจะพยายามดึงคลาสโมเดลทันทีที่นำเข้าแอปของคุณในครั้งแรก

get_user_modelไม่สามารถรับประกันได้ว่าUserโมเดลถูกโหลดลงในแคชของแอพแล้ว อาจใช้งานได้ในการตั้งค่าเฉพาะของคุณ แต่เป็นสถานการณ์ที่เกิดขึ้นแล้ว หากคุณเปลี่ยนการตั้งค่าบางอย่าง (เช่นลำดับของINSTALLED_APPS) อาจทำให้การนำเข้าเสียหายได้เป็นอย่างดีและคุณจะต้องใช้เวลาในการแก้ไขข้อบกพร่องเพิ่มเติม

settings.AUTH_USER_MODEL จะส่งผ่านสตริงเป็นโมเดลคีย์ต่างประเทศและหากการดึงคลาสโมเดลล้มเหลวในขณะที่อิมพอร์ตคีย์ต่างประเทศนี้การดึงข้อมูลจะล่าช้าจนกว่าคลาสโมเดลทั้งหมดจะถูกโหลดลงในแคช


7
ในทางกลับกันคุณสามารถพบปัญหาการนำเข้าแบบวงกลมกับโมเดลได้ต่างประเทศ (get_user_model ())
Chris Clark

2
เอกสารส่วนนี้ระบุว่า "โดยทั่วไปคุณควรอ้างอิงโมเดลผู้ใช้ด้วยการAUTH_USER_MODELตั้งค่าในโค้ดที่เรียกใช้ในเวลานำเข้าget_user_model()ใช้งานได้เมื่อ Django นำเข้าโมเดลทั้งหมดเท่านั้น"
Hamish Downer

7
ดังนั้นในฟังก์ชัน (มุมมองแบบจำลอง / อนุกรม / รูปแบบวิธีการ) ใช้get_user_model()สำหรับแอตทริบิวต์คลาสใช้AUTH_USER_MODEL?
Nick T

53

ใหม่ตั้งแต่ Django 1.11.2

ตั้งแต่ Django 1.11 คุณสามารถใช้ได้get_user_model()ทั้งสองกรณี! ดังนั้นหากคุณไม่ต้องการรบกวนเรื่องนี้ต่อไปก็รับมันไป

"ในทั้งสองกรณี" หมายถึง: หากคุณต้องการรูปแบบผู้ใช้สำหรับการเข้าถึงแอตทริบิวต์ของมันเช่นเดียวกับว่าคุณต้องการกำหนด ForeignKey / ManyToMany-relations

จากบันทึกการเปลี่ยนแปลง :

ตอนนี้ 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โดยเฉพาะอย่างยิ่งสำหรับผู้อ่านที่สับสนเกี่ยวกับความแตกต่าง)
Ilja

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

get_user_model () ส่งคืนคลาสโมเดล ACTUAL ไม่ใช่สตริง

ดังนั้นในกรณีที่คุณต้องการรุ่นผู้ใช้ให้ใช้ get_user_model () หากคุณต้องการตำแหน่ง (module.model เป็นสตริง) ให้ใช้ settings.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คือแบบจำลอง
Matt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.