【问题标题】:Django Multiple User Profiles with Class based views (Best Practices)具有基于类的视图的 Django 多个用户配置文件(最佳实践)
【发布时间】:2016-07-24 03:02:22
【问题描述】:

我有一个网站,其中有两种用户(比如说):学生和导师。

这两种类型具有共同的登录功能、年龄、性别等,但具有不同的属性,例如学生成绩单和导师学位证书。

我阅读了这个问题:Django - Multiple User Profiles 并设置了我的个人资料,如下所示:

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, related_name='profile')
    mobile = models.CharField(max_length=10, blank=False, null=True)
    picture = models.ImageField(
        upload_to='images/', default='images/newuser.png')
    age = models.IntegerField(null=True)
    slug = models.SlugField()
    ...

还有其他两个链接到上述内容的模型。例如:

class StudentProfile(models.Model):
    profile = models.ForeignKey(UserProfile, related_name="user_profile")
    #more custom attributes

class TutorProfile(models.Model):
   profile = models.ForeignKey(UserProfile, related_name="doctor_profile")
   #more custom attributes

现在我的问题:

1) SlugFieldUserProfile 属性上定义,但理想情况下将使用 User.username 字段。这意味着这两个表之间的连接每次都会发生。这是意料之中的吗?

2) 假设我使用基于类的视图,编辑/查看配置文件将取决于相关的 UserProfile。但我希望用户能够在同一页面上编辑/查看他的所有详细信息。因此,我也必须获取TutorProfile / StudentProfile 并添加自定义逻辑以确保它们也发生更新。

在我看来应该有适当的方法来处理这些情况(因为很多网站都有类似的要求)。在这种情况下应遵循哪些最佳做法?

【问题讨论】:

  • 谁有这个的替代实现?
  • 我现在正在研究一个类似的问题,如果我想出什么我会发布答案。

标签: django django-models django-views django-class-based-views


【解决方案1】:

在寻找答案时,我发现了一个我认为可能适合我需要的解决方案(在此处发布以欢迎批评并帮助其他可能正在寻找答案的人)。

取自Django Design patterns and Best Practices

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, related_name='profile')
    mobile = models.CharField(max_length=10, blank=False, null=True)
    picture = models.ImageField(
        upload_to='images/', default='images/newuser.png')
    age = models.IntegerField(null=True)
    gender = models.IntegerField(null=True)
    user_type = models.CharField(max_length=20, choices=UserTypes.CHOICES)
    slg = models.SlugField()    

    class Meta(object):
        abstract = True


class StudentProfile(models.Model):
    report_card = models.FileField(upload_to="/temp")
    house = models.CharField()

    class Meta(object):
      abstract = True


class TutorProfile(models.Model):
    performance = models.IntegerField(default=0)
    salary = models.IntegerField(default=0)

    class Meta(object):
      abstract = True

一个基本的抽象类和两个涵盖各种用户配置文件的特定类。像这样将它们分开可以让我们轻松推断每种用户类型中存在的各种字段。 最后,

 class Profile(UserProfile, StudentProfile, TutorProfile):
     pass

这是用作settings.AUTH_USER_MODEL 的模型。

总的来说,我看到的优势:

  1. 在用户 edit/view 页面上进行单个 DB 调用。
  2. 整体上更容易思考。

缺点:浪费空间很多。

谁有更好的建议?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 2011-12-18
    • 2021-05-03
    • 2011-03-28
    • 1970-01-01
    • 2021-07-09
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多