注意:鉴于 Django 用户模型自 1.5 版以来的更新,我再次问了这个问题。
我正在重建和改进现有的 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>
...
这对我们来说效果很好,我们在用户表中有基本的用户信息,然后在学生和企业表中有更详细的信息。获取用户的完整个人资料需要以下伪代码:
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
andBusiness
模型中,因为每个Student
/Business
都有一个User
但每个User
只有一个Student
或Business
与之相关的一个物体。我不确定如何为管理员添加条件内联。
问题:鉴于这种结构和这些问题,建立这个站点的最佳方式是什么,尤其是数据模型?