直到最近,我正在使用的一个项目使用一个超级UserProfile来处理两种不同类型用户的所有配置文件数据。当然这很麻烦,现在是重构的时候了。
在我尝试重构模型时,我将模型拆分为Requester和Funder,并创建了一个抽象的UserProfile模型,它们都是子类:
class UserProfile(models.Model):
class Meta:
abstract = True
user = models.OneToOneField(User)
def __unicode__(self):
return unicode(self.user)
class Requester(UserProfile):
def requested(self, event):
"""Check if a user requested an event."""
return self == event.requester
class Funder(UserProfile):
osa_email = models.EmailField(null=True) # The e-mail of the contact in OSA
mission_statement = models.TextField(max_length=256)
在我的settings.py文件中,我调整了AUTH_PROFILE_MODULE。
AUTH_PROFILE_MODULE = "app.UserProfile"
问题是,当点击使用“User.get_profile()”的页面时,它会中断,报告:
Unable to load the profile model, check AUTH_PROFILE_MODULE in your project settings
我不太确定这里发生了什么。根据{{3}},所有看起来都是。
有人可以解释为什么会失败吗? (我遇到了很多替代解决方案,但如果可能的话,我更愿意解决这个问题,而不是采用一些黑客攻击。)
答案 0 :(得分:2)
你想做的事情是不可能的。 AUTH_PROFILE_MODULE
期待一个具体的模型,而不是一个抽象的模型。具体意味着它有一个表,可以创建实例。抽象模型只能是子类。
为什么django无法知道为您的用户返回哪个模型实例的逻辑原因。请求者?出资者?简单地作为抽象参考给django没有提示。一种方法可能是查看contenttypes framework,并可能提出一个通用的UserProfile模型,其中包含对正确的子配置文件类型的引用。然后,您可以从UserProfile中删除abstract = True,并为特定的Profile模型创建generic relation。然后,AUTH_PROFILE_MODULE
将简单地引用该单个UserProfile,但其实例可以使用.content_object
来获取特定的子对象。
我确信您可以通过多种方式解决此问题,但我只是在评论此特定方法无效的原因。