Django sử dụng get_user_model so với cài đặt.AUTH_USER_MODEL


98

Đọc Tài liệu Django:

get_user_model ()

Thay vì đề cập trực tiếp đến Người dùng, bạn nên tham chiếu mô hình người dùng bằng django.contrib.auth.get_user_model (). Phương thức này sẽ trả về mô hình Người dùng hiện đang hoạt động - mô hình Người dùng tùy chỉnh nếu một mô hình được chỉ định hoặc Người dùng nếu không.

Khi bạn xác định khóa ngoại hoặc quan hệ nhiều-nhiều với mô hình Người dùng, bạn nên chỉ định mô hình tùy chỉnh bằng cách sử dụng cài đặt AUTH_USER_MODEL.

Tôi bối rối với văn bản trên. Tôi có nên làm điều này:

author = models.ForeignKey(settings.AUTH_USER_MODEL)

hoặc cái này ...

author = models.ForeignKey(get_user_model())

Cả hai dường như hoạt động.

Câu trả lời:


87

Việc sử dụng settings.AUTH_USER_MODELsẽ trì hoãn việc truy xuất lớp mô hình thực tế cho đến khi tất cả các ứng dụng được tải. get_user_modelsẽ cố gắng truy xuất lớp mô hình tại thời điểm ứng dụng của bạn được nhập lần đầu tiên.

get_user_modelkhông thể đảm bảo rằng Usermô hình đã được tải vào bộ đệm ứng dụng. Nó có thể hoạt động trong thiết lập cụ thể của bạn, nhưng nó là một kịch bản hit-and-miss. Nếu bạn thay đổi một số cài đặt (ví dụ: thứ tự của INSTALLED_APPS), nó rất có thể làm hỏng quá trình nhập và bạn sẽ phải dành thêm thời gian để gỡ lỗi.

settings.AUTH_USER_MODEL sẽ chuyển một chuỗi làm mô hình khóa ngoại và nếu truy xuất lớp mô hình không thành công tại thời điểm khóa ngoại này được nhập, việc truy xuất sẽ bị trì hoãn cho đến khi tất cả các lớp mô hình được tải vào bộ đệm.


7
Cụ thể, bạn có thể gặp phải các vấn đề nhập vòng tròn với các mô hình.ForeignKey (get_user_model ())
Chris Clark

2
Phần này của tài liệu có nội dung "Nói chung, bạn nên tham chiếu Mô hình người dùng với AUTH_USER_MODELcài đặt trong mã được thực thi tại thời điểm nhập. get_user_model()Chỉ hoạt động khi Django đã nhập tất cả các mô hình."
Hamish Downer

7
Vì vậy, cụ thể, trong các chức năng (khung nhìn, mô hình / phương thức tuần tự hóa / biểu mẫu), sử dụng get_user_model(), đối với thuộc tính lớp sử dụng AUTH_USER_MODEL?
Nick T

53

Mới kể từ Django 1.11.

Kể từ Django 1.11, bạn có thể sử dụng get_user_model()trong cả hai trường hợp! Vì vậy, nếu bạn không muốn bận tâm về nó thêm, chỉ cần lấy nó.

"trong cả hai trường hợp" có nghĩa là: nếu bạn cần mô hình người dùng để truy cập các thuộc tính của nó, cũng như nếu bạn muốn xác định quan hệ ForeignKey / ManyToMany.

Từ bảng thay đổi :

get_user_model () hiện có thể được gọi tại thời điểm nhập, ngay cả trong các mô-đun xác định mô hình.

vì vậy ... vẫn còn một lý do để sử dụng settings.AUTH_USER_MODEL? Chà, các tài liệu vẫn khuyến nghị settings.AUTH_USER_MODEL(là một chuỗi) để xác định quan hệ, nhưng không đưa ra lý do rõ ràng. Có thể có lợi cho hiệu suất, nhưng dường như không quan trọng lắm.

Ví dụ về mã:

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!
        ...
    )

Cảm ơn bạn đã chỉ ra rằng get_user_model()có thể được gọi tại thời điểm nhập; Tuy nhiên, Django vẫn khuyên rằng người dùng xác định foreign-key và nhiều-nhiều mối quan hệ sử dụng AUTH_USER_MODEL
kevins

2
cảm ơn bạn đã chỉ ra khuyến nghị này, bằng cách nào đó tôi đã bỏ qua nó khi viết thư trả lời, nhưng bây giờ tôi đã tìm thấy nó. Tôi đã cố gắng tích hợp điều này vào câu trả lời (vẫn được ưu tiên get_user_model, đặc biệt là đối với những độc giả đang nhầm lẫn về sự phân biệt)
Ilja

7

Kể từ Django 1.11, get_user_model()thực sự sử dụng 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 trả về một chuỗi (vị trí của mô hình Người dùng), ví dụ: 'user_accounts.User'

get_user_model () trả về lớp mô hình ACTUAL, không phải là một chuỗi.

Vì vậy, trong trường hợp bạn cần mô hình Người dùng, hãy sử dụng get_user_model (). Nếu bạn cần vị trí của nó (module.model dưới dạng chuỗi), hãy sử dụng cài đặt.AUTH_USER_MODEL.


-11

Một cách để dự phòng cho mô hình người dùng mặc định nếu AUTH_USER_MODEL không được đặt:

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

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

7
AUTH_USER_MODELđã có mặc định, vì vậy nó sẽ luôn được đặt.
knbk

4
settings.AUTH_USER_MODEL cũng là một chuỗi và dự phòng của bạn Userlà một mô hình
Matt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.