[英]How to set up Django models with two types of users with very different attributes
注意:自從版本1.5以來Django的用戶模型更新后,我再次提出這個問題 。
我正在重建並改進已經存在的Django站點並將其從Webfaction轉移到Heroku,從Amazon的SimpleDB轉移到Heroku Postgres(盡管在開發時在Sqllite3上進行本地測試)。 我正在做的很多事情都是使用內置的Django功能,比如Django管理員,用戶身份驗證等。
從概念上講,該網站有兩種用戶:學生和企業。 這兩種類型的用戶具有完全不同的權限和存儲的信息。 情況就是這樣,在網站的原始結構中,我們建立了如下數據模型:
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>
...
這對我們來說非常有效,我們在Users表中提供了簡單的用戶信息,然后在Students and Businesses表中提供了更詳細的信息。 獲取用戶的完整個人資料需要此偽代碼:
def get_user_profile(id):
if Users(id=id).Business_or_Student = 'B':
return Businesses(id=id)
else:
return Students(id=id)
在移動過程中,我發現Django的內置User
對象具有非常有限的功能,我不得不使用我創建的UserProfile
類擴展它,然后有額外的Student
和Business
表。 鑒於我在Django管理員中所做的所有補丁,並且對Django模型相對不熟悉,因為我總是采用不同的方式,我不確定這是否是最好的方法,或者我應該只需將企業和學生的所有信息都粘貼在UserProfile
表中,然后將兩者區分為不同的組,或者甚至在內置的User
對象中有一些方法可以完成這一切。
由於企業和學生也有不同的界面,我正在認真考慮在我的Django項目中將兩者設置為不同的應用程序,從而完全分離他們的視圖,模型等。 這看起來像是這樣的:
MyProject/
MyProject/ (project folder, Django 1.4)
mainsite/
students/
businesses/
我最關心的一個問題是Django Admin。 在擴展User
,我必須添加以下代碼:
class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name_plural = 'profile'
class UserAdmin(UserAdmin):
inlines = (UserProfileInline, )
但是,當User
被拉起時,我希望用戶的業務或學生方面的信息顯示在Django管理員中,但是模型的ForeignKey
部分在Student
和Business
模型中,因為每個Student
/ Business
都有User
但每個User
只有一個Student
或一個Business
對象與之相關聯。 我不知道如何為Admin添加條件內聯。
問題:鑒於這種結構和這些問題,設置此站點的最佳方式是什么,尤其是數據模型?
這不是一個完整的解決方案,但它會讓您了解從哪里開始。
mainsite
創建UserProfile
模型。 這將保留兩種類型用戶的任何公共屬性。 使用OneToOne(...)
字段將其與User
模型相關聯。 Business
和Student
創建另外兩個模型,這些模型與UserProfile
具有OneToOne
關系(或從UserProfile
繼承)。 這將包含特定於該類型用戶的屬性。 文檔: 多重繼承 / OneToOne關系 UserProfile
添加一個字段,以區分它是商家還是學生的個人資料。 然后,對於內容管理:
save()
函數以自動檢查沖突(例如,有一個與UserProfile
關聯的Business
和Student
條目,或者沒有條目)。 __unicode__()
表示。 我希望我能理解你的問題...也許這可行嗎? 您創建一個抽象的CommonInfo類,它繼承到不同的子類(學生和企業)
class CommonUser(models.Model):
user = models.OneToOne(User)
<any other common fields>
class Meta:
abstract = True
class Student(CommonUser):
<whatever>
class Business(CommonUser):
<whatever>
在這種情況下,模型將在DB中創建,每個表中都有基類字段。 因此,當您與學生一起工作時,您可以運行
students = Students.objects.get.all()
讓所有學生都參與其中。
然后為每個學生做:
for student in students:
print student.user.username
對於Business對象也是如此。
讓學生使用用戶:
student = Student.objects.get(user=id)
用戶名將是唯一的,因此在創建新的學生或企業時,如果正在保存現有用戶名,則會引發異常。
忘了添加鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.