在Django中建模不同类型用户的账户

5
假设你有一个应用程序,不同类型的用户可以注册:公司、律师和客户。公司有许多律师;律师有许多客户。当然,公司用户的视图与律师用户的视图不同;两者与客户用户也不同。
你会如何建立这三种不同的用户模型?我可以想到以下方法:
三个不同的模型,每个模型都有一个指向“用户”(User)的外键,每个模型都有自己的字段,例如:
class Firm(models.Model):
 user = models.ForeignKey(User)
class Lawyer(models.Model):
 user = models.ForeignKey(User)
 specialty = models.CharField(max_length=100)
class Client(models.Model)
 user = modelsForeignKey(User)

现在,您可以创建一个单独的模型作为咨询,使用两个ForeignKeys:一个指向律师,另一个指向客户。您还可以通过创建一个带有指向ConsultationForeignKey的模型Resource来向咨询添加资源(例如文档或其他东西)。
这种方法使得很难区分用户。例如,您如何知道userFirm?您需要多次查询数据库或将Profile分配给通用的User对象。
您还可以仅向User添加一个Profile并包含一个Role,然后根据user.get_profile().role对视图和身份验证进行渠道处理。
您该如何解决这个问题呢?
2个回答

5

我会按照您建议的做法:

您也可以为用户添加一个仅包含角色的配置文件,然后根据user.get_profile().role来进行视图和身份验证。

创建一个具有角色选择字段的配置文件。创建一些装饰器,如@lawyer_only,确保您的视图只能被律师角色的用户访问。


是的,我想我会选择这个。谢谢!(装饰器的想法很好) - Escualo

0

这只是一种语法糖来表示OneToOne关系,我认为没有比显式的OneToOne更好的优势。 - Mikhail Korobov
@Mike:不完全是这样。当我设计面向对象的软件时,我更喜欢以对象模型为主要关注点(数据存储稍后再考虑)。因此,如果律师是用户,我宁愿在我的代码中明确表示这种“is a”关系,这样可以在任何需要用户实例的地方使用律师实例。顺便说一句,ORM将继承和单一组合建模方式视为相同的方式(作为一对一的关系)。话虽如此,Django的模型继承确实有一些怪癖,使其不能完全像对象继承那样工作。 - Carles Barrobés

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接