注意:自asked this question again以来,自1.5版以来,我已经更新了Django的用户模型。
我正在重建和改进现有的Django网站,并将其从Webfaction转移到Heroku,从亚马逊的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表中提供了简单的用户信息,然后在学生和企业表中提供了更详细的信息。获取用户的完整配置文件需要使用此伪代码:
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
扩展它我已经创建了I类,然后有了其他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
对象。我不确定如何为管理员添加条件内联。
问题:鉴于此结构和这些问题,设置此网站的最佳方式是什么,尤其是数据模型?
答案 0 :(得分:5)
这不是一个完整的解决方案,但它会让你知道从哪里开始。
UserProfile
中创建mainsite
模型。这将保留两种类型用户的任何公共属性。使用User
字段将其与OneToOne(...)
模型相关联。Business
和Student
,每个模型与OneToOne
都有UserProfile
个关系(或继承自{{ 1}})。这将包含特定于该类型用户的属性。文档:Multitable inheritance / OneToOne Relationships UserProfile
中添加字段,以区分是商家还是学生的个人资料。然后,对于内容管理:
UserProfile
函数以自动检查冲突(例如,与save()
关联的Business
和Student
都有条目,或者没有条目。< / LI>
UserProfile
表示。 答案 1 :(得分:4)
我希望我能理解你的问题...也许这可行吗?您创建一个抽象的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)
用户名将是唯一的,因此在创建新学生或商家时,如果正在保存现有用户名,则会引发异常。
忘记添加link