6

注意:鉴于 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一部分在StudentandBusiness模型中,因为每个Student/Business都有一个User但每个User只有一个Student Business与之相关的一个物体。我不确定如何为管理员添加条件内联。

问题:鉴于这种结构和这些问题,建立这个站点的最佳方式是什么,尤其是数据模型?

4

2 回答 2

5

这不是一个完整的解决方案,但它会让您知道从哪里开始。

  • 在 中创建UserProfile模型mainsite。这将包含两种类型用户的任何共同属性。将其User与具有OneToOne(...)字段的模型相关联。
  • 在每个应用程序中再创建两个模型,(学生/企业)BusinessStudent,它们都OneToOneUserProfile(或继承自UserProfile)有关系。这将包含特定于该类型用户的属性。文档:多表继承/ OneToOne 关系
  • 可以添加一个字段UserProfile来区分它是企业还是学生的个人资料。

然后,对于内容管理:

  • 定义save()自动检查冲突的功能(例如,两者都有一个条目BusinessStudent与 a 相关联UserProfile,或者没有条目)。
  • __unicode__()在必要时定义表示。
于 2012-10-17T04:17:56.933 回答
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>

在这种情况下,模型将在数据库中创建,每个表中都有基类字段。因此,当您与学生一起工作时,您会运行一个

students = Students.objects.get.all() 

获取所有学生,包括公共信息。

然后为每个学生做:

for student in students:
    print student.user.username

业务对象也是如此。

要让学生使用用户:

student = Student.objects.get(user=id)

The username will be unique thus when creating a new Student or Business it will raise an exception if an existing username is being saved.

Forgot to add the link

于 2012-10-17T09:49:33.913 回答