【问题标题】:Database table design confusion in DjangoDjango中的数据库表设计混乱
【发布时间】:2013-09-30 07:03:38
【问题描述】:

系统概览:

在我的系统中,客户端可以注册应用程序,然后客户端可以创建角色并使用定义的角色创建用户。因此,一个客户端可以拥有多个用户。

我已经创建了一个与用户相关的客户端模型。

class Client(models.Model):

    user = models.OneToOneField(User)

    # True if the signed up user is client
    is_client = models.BooleanField(default=True)   

    # Which company the client represents
    company = models.CharField(max_length=200, null=True)

    # Address of the company
    address = models.CharField(max_length=200, null=True)

但我认为这是一种错误的做法。因为当我想列出某些客户的用户时,我不能这样做。另外,我应该在哪里存储用户角色?我是否必须修改 auth_permission 表。谢谢

【问题讨论】:

    标签: django database-design django-models


    【解决方案1】:

    您需要为用户添加ForeignKey() 关系到客户端而不是OneToOne。为此,您可以扩展 django 的 User 模型或创建自己的用户配置文件类。

    要在User 模型中扩展和添加属性,请参阅Extending User model


    如果你想使用django内置的User模型和身份验证等,更好的方法是......

    1. 在您的应用中创建具有OneToOneUser 关系的用户配置文件模型。

    2. 在此用户配置文件模型中添加有关用户和与其他模型的关系的特定信息。您可以在此类中设置角色并与Client 模型建立ForeignKey() 关系,因为您希望一个客户端有多个用户。

      类 UserProfile(models.Model): 客户端 = 模型.ForiegnKey('客户端') ...

    3. 在创建新用户时为用户创建UserProfile 实例。

    4. 之前,django 有 user.get_profile() 方法来获取用户的用户配置文件对象,但在 1.5.1 中已弃用。

    【讨论】:

    • 我想实现你的第二种方法。但与其创建另一个模型userProfile,我不能假设ClientUserProfile
    • @user2032220,你想要很多用户来获得一个客户的权利,那么你不能用Client作为UserProfile来做到这一点
    • 好的,谢谢。但是如果我做user = models.ForeignKey(User),而不是OnetoOne,它可以正确地完成。
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多