【发布时间】:2012-03-27 20:28:06
【问题描述】:
最初,我的 UserProfile 是这样开始的:
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
verified = models.BooleanField()
mobile = models.CharField(max_length=32)
def __unicode__(self):
return self.user.email
与settings.py 中设置的AUTH_PROFILE_MODULE = 'accounts.UserProfile' 配合得很好。
但是,我的网站中有两种不同类型的用户,个人和公司,每个用户都有自己独特的属性。例如,我希望我的个人用户只有一个用户,因此拥有user = models.OneToOneField(User),而对于企业,我希望他们拥有多个与同一个人资料相关的用户,所以我将拥有user = models.ForeignKey(User)。
所以我考虑将模型分成两个不同的模型,IndivProfile 和 CorpProfile,它们都继承自 UserProfile,同时将特定于模型的属性移动到相关的子模型中。对我来说似乎是个好主意,并且可能会起作用,但是我无法以这种方式指定 AUTH_PROFILE_MODULE,因为我有两个不同用户的用户配置文件。
我也想过反过来做,让UserProfile从多个类(模型)继承,像这样:
class UserProfile(IndivProfile, CorpProfile):
# some field
def __unicode__(self):
return self.user.email
这样我会设置AUTH_PROFILE_MODULE = 'accounts.UserProfile' 并解决它的问题。但这看起来行不通,因为 python 中的继承是从左到右工作的,IndivProfile 中的所有变量都将占主导地位。
当然,我总是可以拥有一个模型,其中 IndivProfile 和 CorpProfile 变量都混合在一起,然后我会在必要时使用所需的模型。但这对我来说看起来并不干净,我宁愿将它们隔离并在适当的地方使用适当的模型。
对干净的方法有什么建议吗?
【问题讨论】:
-
inheritance 呢?
-
我可以将
UserProfile抽象化并让IndivProfile和CorpProfile继承自UserProfile。这仍然不能解决AUTH_PROFILE_MODULE的问题。它会指向哪一个? -
如何将企业+个人+帐户类型字段添加到一个模型中?我认为如果你只有两种类型可能没问题,但如果你有超过 2 种或者这些配置文件非常不同,则可能会很糟糕。
-
这不能解决
user对每种类型都不同的问题。请阅读帖子,我已经提到我可以做到,但我正在寻找一种干净的方法。 -
一个小问题:如果您有多个用户与同一个公司资料相关,您不能在公司资料上使用
ForeignKey字段对其进行建模。
标签: django django-models django-users