1

我在 django 1.5 中创建了一个自定义用户类,继承了 AbstractBaseUser。该类有一个字段“电子邮件”,它是唯一的 ID。但是,我正在使用一个外部开发的应用程序,它期望 User 类有一个username用于get(). 我不希望在我的用户类中添加额外的不必要字段,并且希望在该应用程序询问用户名时将电子邮件地址返回给该应用程序。我试图在我的用户类中使用一个属性来做到这一点:

@property
def username(self):
    return self.email

但我继续得到FieldError ... Cannot resolve keyword 'username' into field

我猜这与数据库查找有关。还有另一种方法可以实现这一目标吗?也许是一种指定字段名别名的方法?

4

1 回答 1

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'
于 2013-06-22T16:00:10.797 回答