我在django 1.5中创建了一个自定义用户类,继承了AbstractBaseUser。该类有一个字段'email',它是唯一的ID。但是,我正在使用外部开发的应用程序,该应用程序期望User类具有用于username
的字段get()
。我不希望在我的用户类中添加额外的不必要字段,并希望在要求输入用户名时将电子邮件地址返回到此应用程序。我试图使用我的用户类中的属性来执行此操作:
@property
def username(self):
return self.email
但我继续得到FieldError ... Cannot resolve keyword 'username' into field
我猜这与数据库查找有关。还有另一种方法来实现这个目标吗?也许是一种指定fieldname别名的方法?
答案 0 :(得分:0)
get()
调用QuerySet.filter()
,创建属性对QuerySet
没有影响,只有在访问user
实例的属性user.username
时才有效。
您可以通过创建自定义查询集来执行此操作:
from django.db.models.query import QuerySet
class MyUserManager(BaseUserManager):
def __getattr__(self, attr, *args):
try:
return getattr(self.__class__, attr, *args)
except AttributeError:
return getattr(self.get_query_set(), attr, *args)
def get_query_set(self):
return MyQuerySet(self.model)
class MyQuerySet(QuerySet):
def filter(self, *args, **kwargs):
if 'username' in kwargs:
kwargs.update({'email': kwargs.pop('username')})
return super(MyQuerySet, self).filter(*args, **kwargs)
class MyUser(AbstractBaseUser):
email = ...
objects = MyUserManager()
USERNAME_FIELD = 'email'