2013-06-02 49 views
5

Django 1.5+ cho phép chúng tôi thêm trường tùy chỉnh cho Người dùng. Tôi muốn sử dụng thực tế này, nhưng tôi không nhất thiết phải biết thực hành tốt là gì. Đây là một tình huống tôi bối rối về cách xử lý các mô hình.Django 1.5 + Mối quan hệ kiểu người dùng

Với tùy chọn để thêm các trường để User, nếu một dự án chỉ có một loại User, cho phép nói một mô hình Student, tôi có thể chỉ đơn giản là thêm các trường học cụ thể để User? Tôi mới đến Django, nhưng tôi tin rằng thay thế sẽ là thiết lập cài đặt chung User và tạo mô hình Student và một trường duy nhất một trong một trong đó gọi người dùng.

Bạn có nên mở rộng một trường của Django User để bắt chước trường của mô hình, ngay cả khi dự án được đảm bảo chỉ có một loại người dùng?

Trả lời

12

Nếu bạn chỉ có một loại người dùng và đang sử dụng Django 1.5+, tôi khuyên bạn nên tận dụng lợi thế của người dùng AbstractUser mới. Extending Django's default user

Như một ví dụ, nơi bạn muốn thêm ngày tháng năm sinh và màu sắc yêu thích:

#myusers/models.py 
from django.contrib.auth.models import AbstractUser 
from django.db import models 

class MyUser(AbstractUser): 
    dob = models.DateField() 
    favorite_color = models.CharField(max_length=32, default='Blue') 

Nếu bạn cần linh hoạt hơn bạn có thể kéo dài tuổi AbstractBaseUser thay vì AbstractUser, nhưng đối với hầu hết các trường hợp cơ bản bạn chỉ nên cần AbstractUser.

Cũng lưu ý rằng trong cả hai trường hợp, bạn sẽ cần phải reference your user model by using settings.AUTH_USER_MODEL.

Sử dụng ra ví dụ trên và giả sử ứng dụng nó được quy định tại được gọi là myusers:

#settings.py 
AUTH_USER_MODEL = 'myusers.MyUser' 

Phương pháp bạn đề cập đến việc tạo ra một mô hình sinh viên với một lĩnh vực one-to-one với mô hình tài khoản vẫn hoạt động , nhưng không sạch sẽ (vẫn còn những trường hợp có ý nghĩa nếu bạn có nhiều loại người dùng).

Tôi thường không thích tham khảo sách trong câu trả lời, nhưng tôi thấy rằng Two Scoops of Django's, Chương 16 trên mô hình Người dùng đã giải thích rõ hơn về nơi các tùy chọn khác nhau phù hợp với phiên bản hiện tại của Django trực tuyến tài liệu. Cuốn sách nói chung là một phần giới thiệu rất hữu ích cho Django và được viết dựa trên 1.5. Bạn sẽ phải mua cuốn sách hoặc tìm một người có nó, mặc dù ... (FYI: Tôi không nhận được bất kỳ tiền giới thiệu này).

Bạn cũng có thể xem câu hỏi/câu trả lời SO này: https://stackoverflow.com/a/14104748/307293

+0

Điều gì không sạch về nó? –

+3

Nó tạo thêm một bảng trong cơ sở dữ liệu. Nếu bạn đang tham khảo những thứ như tên và họ thường xuyên cùng với một số thông tin tùy chỉnh của bạn yêu cầu thêm JOIN mỗi lần. – Jacinda

+0

Jacinda - tình cờ tôi đã mua cuốn sách sớm hơn hôm nay! Tôi chưa đến đó, nhưng nhìn vào tham chiếu đó, họ đưa ra ba lựa chọn tốt: liên kết ngược lại từ một mô hình liên quan, lớp con AbstractUser, hoặc lớp con AbstractBaseClassUser. Thật không may tôi đang sử dụng một ứng dụng của bên thứ ba mà tôi muốn phân lớp, bất kỳ ý tưởng về làm thế nào để làm điều này? – Joker

0

Bạn không nên chạm vào mô hình django đã đóng góp User (từ khung xác thực). Điều này sẽ phá vỡ nâng cấp và bạn không biết những hậu quả khác nó có thể có.

Có hai cách cơ bản để làm điều này:

  1. Nếu bạn chỉ cần lưu trữ thêm thông tin về người sử dụng, nhưng không cần phải thay đổi cách cơ chế xác thực/giấy phép hoạt động, tạo ra một mô hình và thêm OneToOneField vào mẫu User. Trong mô hình này, lưu trữ bất kỳ thông tin linh tinh nào khác.

  2. Nếu bạn muốn thay đổi cách xác thực hoạt động, bạn có thể create your own User model và sử dụng django (chỉ 1,5+).

+5

Điều này không đúng nếu bạn đang bắt đầu một ứng dụng mới trong 1,5. Thực tiễn tốt nhất mới nếu bạn chỉ cần thêm các trường bổ sung là kế thừa từ AbstractUser. – Jacinda

+0

Không, bạn chỉ kế thừa từ AbstractUserModel khi bạn đang tạo một mô hình người dùng _replacement_; và bạn không nên làm điều đó nếu bạn chỉ muốn thêm một trường. Bạn nên tạo thay thế Mô hình người dùng của riêng mình nếu bạn đang thực hiện một số thay đổi cơ bản trong quá trình xác thực/ủy quyền sẽ hoạt động như thế nào cho ứng dụng của bạn. –

+3

Tôi không nói về AbstractBaseUser, mà đang tạo ra một sự thay thế. Tôi đang nói về AbstractUser. Từ các tài liệu: "Nếu bạn hoàn toàn hài lòng với mô hình Người dùng của Django và bạn chỉ muốn thêm một số thông tin tiểu sử bổ sung, bạn có thể chỉ cần phân lớp django.contrib.auth.models.AbstractUser và thêm các trường tiểu sử tùy chỉnh của bạn. thực hiện đầy đủ User mặc định dưới dạng một mô hình trừu tượng. " – Jacinda

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