2010-05-03 35 views
15

Để mở rộng đối tượng người dùng với các trường tùy chỉnh, tài liệu Django khuyên bạn nên sử dụng UserProfiles. Tuy nhiên, theo this câu trả lời cho một câu hỏi về vấn đề này từ một năm hoặc lâu hơn lại:Mở rộng đối tượng người dùng trong Django: Mô hình kế thừa người dùng hoặc sử dụng UserProfile?

mở rộng django.contrib.auth.models.User cũng làm việc tốt hơn bây giờ - kể từ khi refactoring mã thừa kế của Django trong API mô hình.

Và các bài viết như this bố trí cách mở rộng mô hình người dùng với trường tùy chỉnh, cùng với lợi thế (truy xuất thuộc tính trực tiếp từ đối tượng người dùng, thay vì thông qua .get_profile()).

Vì vậy, tôi đã tự hỏi liệu có bất kỳ sự đồng thuận nào về vấn đề này hay không hoặc lý do sử dụng vấn đề này hoặc lý do khác. Hoặc ngay cả những gì đội Django hiện đang suy nghĩ?

+0

Bản sao có thể có của [Mở rộng mô hình Người dùng với các trường tùy chỉnh trong Django] (http: // stackoverflow.com/questions/44109/mở rộng-người dùng-model-với-tùy chỉnh-lĩnh vực-in-django) –

Trả lời

8

Tôi bỏ phiếu cho việc sử dụng UserProfiles.

Tôi sử dụng một số ứng dụng bên thứ ba. Và khóa ngoài cho Người dùng sẽ luôn trỏ tới auth.models.User.

Ví dụ:

class Article(models.Model): 
    user = models.ForeignKey('auth.User') # instead of your CustomUser 
    text = .... 

Và mô hình tài khoản tùy chỉnh của bạn:

class CustomUser(User): 
    timezone = models.CharField(max_length=50, default='Europe/London') 

    # Use UserManager to get the create_user method, etc. 
    objects = UserManager() 

gì sẽ xảy ra nếu bạn truy cập vào lĩnh vực người dùng thông qua một ví dụ Điều? Điều này sẽ làm tăng ngoại lệ:

u = a_article.user 
u.timezone 

AttributeError: 'User' object has no attribute 'timezone' 

Có thể đây không phải là vấn đề cho bạn và bạn không nên tránh truy vấn DB bổ sung. Nhưng tôi sẽ sử dụng cách get_profile.

CẬP NHẬT tháng năm 2013

Kể từ Django 1,5 bạn có thể extend mô hình tài khoản mặc định, hoặc substitute với một mô hình hoàn toàn tùy biến.

CẬP NHẬT tháng mười một năm 2016

Các giải pháp trên là lỗi thời, xem nhận xét từ wim

+1

Điều này sẽ tạo ra vấn đề phụ thuộc trong django 1.7 di cư –

+2

Những ngày này, bất kỳ ứng dụng của bên thứ ba * nên * có 'settings.AUTH_USER_MODEL 'là mối quan hệ, nếu họ có hardcoded' 'auth.User'' thì đó là lỗi của bên thứ ba .. – wim

2

Dưới đây là những gì James Bennett nói trong này blog entry about model inheritance:

Tôi muốn cược rằng lẽ 90% hoặc nhiều hơn những điều mọi người nói rằng họ muốn làm với các lớp con có thể được thực hiện tốt hơn bằng cách thay thế xác định một mô hình liên quan và liên kết nó trở lại với một khóa ngoại duy nhất.

Vì vậy, tôi tin rằng cách tốt nhất để đi vẫn là sử dụng một ứng dụng bên ngoài, chẳng hạn như một số thành phần của Pinax, hoặc django-profiles ứng dụng (ban đầu so với cùng James Bennett).

Các vấn đề liên quan