使用别名或属性代替django中的字段

时间:2013-06-22 12:36:02

标签: django django-authentication django-1.5 django-models

我在django 1.5中创建了一个自定义用户类,继承了AbstractBaseUser。该类有一个字段'email',它是唯一的ID。但是,我正在使用外部开发的应用程序,该应用程序期望User类具有用于username的字段get()。我不希望在我的用户类中添加额外的不必要字段,并希望在要求输入用户名时将电子邮件地址返回到此应用程序。我试图使用我的用户类中的属性来执行此操作:

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

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

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

1 个答案:

答案 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'