2009-12-20 61 views
3

我需要为我的Django项目中的每个用户附加大量附加属性。其中一些属性是简单的CharFields,其他的则更复杂ManyToManyFields。对我来说麻烦的是,在我挖掘方法来做到这一点时,我发现了两个选择:文档中解释的The user profile method和我看到在互联网上浮动的user subclassing method在Django中处理额外用户数据的正确方法?

他们都看起来很复杂,我宁愿不选择一个,只发现我经过几个月的发展需要回去切换到另一种方法,所以我在这里问。 权利哪种方式?

+0

我也在为此而战。配置文件会添加额外的不需要的图层,而子分类会在数据库中创建额外的不需要的表格(我相信),并且不会对'request.user'使用多余的修改。这似乎是这样一个常见的情况,你会认为会有一个明确的,很好的方式来做到这一点。其他框架遵循“级联”而不是“覆盖”的范式,您可以轻松扩展所有基类,并且只需让它们工作,但不会,这太方便了。 – mpen 2009-12-20 23:08:06

+0

如果您希望User类拥有所有额外的字段,那么在同步数据库时可以使用它,但这需要一些额外的工作。您只需在特定模型中添加字段并手动更改数据库表。它不漂亮,但没有不需要的图层和表格。您只需编写: User.division = ForeignKey('Division') 然后将适当的列添加到表中。但是我相信这会是我自己的受虐狂;-)子类很好,特别是ORM会隐藏你的两张表。 – gruszczy 2009-12-20 23:11:36

+0

@gruszyczy:如您所说,可以简单地将附加字段monkeypatch到现有模型上。但是你的代码被破坏了。你必须这样做才能正确地设置字段:models.ForeignKey('Division')。contribute_to_class(User,'division') – 2009-12-21 23:21:17

回答

2

我一直以传统方式完成它,这意味着用户配置文件,因为它是在文档中建议的,但这不是最清晰和最优雅的解决方案。您必须始终处理用户没有配置文件的可能性,而我不太喜欢这种配置文件。在下一个项目中,我希望使用子类,如果它只是稳定版本的Django,我会按我公司的同事来尝试。这似乎更自然。

如果你想保持安全,请使用proile。如果您希望冒一点风险并从更好的解决方案中受益,请使用子类。它的推出是有原因的 - 有几次关于配置文件解决方案弱点的讨论。

+0

没有太多的答案在这一个,但这一个,加上唯一的其他答案似乎指向我在配置文件方向。如果它南下,我一定会在这里提出跟进;-) 感谢您的建议! – 2009-12-21 09:13:14

0

推荐的,看起来最简单的是用户配置文件方法。

0

我选择了不同的路径:我有一个客户端模型,女巫应该进行身份验证。我没有将用户模型扩展到适合我的客户端模型,而是将它们分开。然后,当我保存一个新的客户端时,在Client save()方法中为该客户端创建一个用户。然后,我也会执行相同的更新和删除操作以保持同步。我尝试了另外两种选择,但每种都有很多缺点,这就是我放弃它们的原因。这对我来说非常好。

问候。阿尔多。

0

和aldux一样,我更喜欢创建一个分离的模型并让用户模型不变。

相关问题