Lưu ý: Tôi đã kể từ asked this question again được cập nhật cho mô hình người dùng của Django kể từ phiên bản 1.5.Cách thiết lập mô hình Django với hai loại người dùng với các thuộc tính rất khác nhau
Tôi đang xây dựng lại và cải tiến trang web Django đã có và chuyển từ Webfaction sang Heroku và từ SimpleDB của Amazon sang Heroku Postgres (mặc dù thử nghiệm cục bộ trên Sqllite3 khi phát triển). Rất nhiều những gì tôi đang làm là chuyển sang sử dụng chức năng Django tích hợp, như quản trị viên Django, xác thực người dùng, v.v.
Về mặt khái niệm, trang web có hai loại người dùng: Sinh viên và doanh nghiệp. Hai loại người dùng có các quyền và thông tin hoàn toàn khác nhau được lưu trữ về chúng. Đây là rất nhiều trường hợp mà trong cấu trúc ban đầu của trang web, chúng tôi thiết lập mô hình dữ liệu như sau:
Users
ID (primary_key)
Business_or_Student ('B' if business, 'S' if student)
email (unique)
password (hashed, obviously)
...
Students
ID (Foreignkey on Users)
<more information>
...
Businesses
ID (Foreignkey on Users)
<more information>
...
này làm việc khá tốt đối với chúng tôi, và chúng tôi đã có thông tin người dùng bare-xương ở những người sử dụng bảng, và sau đó bất kỳ thông tin chi tiết hơn trong bảng học sinh và doanh nghiệp. Bắt một lý lịch thành viên đầy đủ yêu cầu cái gì đó dọc giả này:
def get_user_profile(id):
if Users(id=id).Business_or_Student = 'B':
return Businesses(id=id)
else:
return Students(id=id)
Trong di chuyển qua, tôi đã phát hiện ra rằng chức năng khá hạn chế xây dựng trong User
đối tượng có Django, và tôi đã có để mở rộng nó với một lớp UserProfile
Tôi đã tạo và sau đó có thêm các bảng Student
và Business
. Với tất cả các bản vá tôi đang làm với điều này trong quản trị Django, và tương đối xa lạ với các mô hình Django vì tôi luôn làm điều đó một cách khác nhau, tôi không chắc đây có phải là cách tốt nhất để đi hay không. chỉ cần gắn tất cả thông tin cho doanh nghiệp và sinh viên trong bảng UserProfile
và chỉ phân biệt hai nhóm với các nhóm khác nhau hoặc thậm chí có một số cách để thực hiện việc này trong đối tượng được xây dựng trong User
.
Vì doanh nghiệp và sinh viên cũng có giao diện khác nhau, tôi nghiêm túc cân nhắc việc thiết lập hai ứng dụng khác nhau trong dự án Django của tôi và tách biệt quan điểm, mô hình, v.v. Điều đó sẽ trông giống như sau:
MyProject/
MyProject/ (project folder, Django 1.4)
mainsite/
students/
businesses/
Một trong những mối quan tâm lớn nhất của tôi là với Quản trị viên Django. Trong việc mở rộng User
, tôi đã có thêm đoạn mã sau:
class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name_plural = 'profile'
class UserAdmin(UserAdmin):
inlines = (UserProfileInline,)
Tuy nhiên, tôi muốn thông tin cho các khía cạnh kinh doanh hoặc sinh viên của người sử dụng để hiển thị trong admin Django khi đó User
được kéo lên, nhưng ForeignKey
một phần của mô hình này là trong mô hình Student
và Business
vì mỗi Student
/Business
có User
nhưng mỗi User
chỉ có một Student
hay một Business
đối tượng kết nối với nó. Tôi không chắc cách thêm Dòng nội tuyến có điều kiện cho Quản trị viên.
Câu hỏi: Với cấu trúc này và những mối quan tâm này, cách tốt nhất để thiết lập trang web này, đặc biệt là mô hình dữ liệu là gì?
Tôi bắt đầu với việc này, nhưng sau đó tôi chuyển sang những 'mối quan hệ giữa OneToOne'' Student' và 'UserProfile' cho 'Student' và' User' vì Django quản trị wouldn' t nhận ra tên người dùng/email của các đối tượng 'UserProfile', vì các đối tượng này được lưu trữ trong' User' thay vì 'UserProfile'. Khi thêm một doanh nghiệp mới, danh sách thả xuống mối quan hệ 'OneToOne' sẽ đơn giản liệt kê' UserProfile Object' lặp đi lặp lại cho đến khi tôi thay đổi nó thành 'User', khi nó bắt đầu liệt kê tên người dùng. Tôi lo lắng về những thứ như vậy xảy ra ở các khu vực khác. Bạn có biết cách đối phó với điều đó không? – jdotjdot
Có, liên kết 'UserProfile' thành' Người dùng', mà django sử dụng để đại diện cho người dùng. Để che dấu vấn đề thả xuống của bạn, hãy thêm phương thức '__unicode __()' vào 'UserProfile' để trả về' self.user.username'. Đây là tên người dùng hiển thị trong trình đơn thả xuống, tuy nhiên sẽ vẫn liên kết đến 'UserProfile'. – Rohan
Cảm ơn bạn, rằng bit cuối cùng là thiên tài. Tôi sẽ để câu hỏi mở trong vài ngày để xem tôi có phản ứng gì khác, nhưng bạn đã vô cùng hữu ích. – jdotjdot