我问过我的用户,他们中的大多数都想要'active_email'选项 - 这意味着他们可以将电子邮件更改为指定的Gmail或其他任何内容。
我已经提出以下解决方案,这不是最干净的: 首先,我从django.contrib.auth中的User继承并使用email = active_email和official_email = sch_email调用这个新类MultipleEmailUser。
然后我重写django.contrib.auth的UserManager来稍微改变API, 最痛苦的部分是将User.object.find()的所有源代码更改为MultipleEmailUser.find()。
有人可以建议我更干净吗? (我最担心的是其他应用只允许向User.email发送电子邮件。)
答案 0 :(得分:3)
您不需要 - 或想要 - 修改User类。只需将OneToOneField的UserProfile类设置回用户,然后设置AUTH_PROFILE_MODULE
设置即可。请参阅the documentation。
答案 1 :(得分:0)
您可以使用名为“email”的property
公开访问您想要的任何数据,而不是真正的数据存储属性。
基本属性语法(来自python docs):
class C(object):
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
在您的情况下,您可以创建名为auth_email
和active_email
的真实数据存储区属性。然后,User.email属性可以在其getter函数中执行一些逻辑,以确定返回哪一个(即如果设置active_email
,则返回它;否则,返回auth_email
)
值得注意的是property
的语法经历了一些变化。从python 2.7开始,它可以以更易读的方式实现,作为装饰器:
class User(BaseModel):
@property # email
def email(self):
if self.active_email:
return self.active_email
return self.auth_email