2013-06-22 2 views
1

Я создал пользовательский класс пользователя в django 1.5, наследующий AbstractBaseUser. Класс имеет поле «email», которое является уникальным идентификатором. Тем не менее, я использую приложение, разработанное извне, которое ожидает, что класс User будет иметь поле username для использования в get(). Я бы предпочел не добавлять лишнее поле в мой класс пользователя и хотел бы вернуть адрес электронной почты в это приложение, когда он запрашивает имя пользователя. Я попытался сделать это, используя свойство в моем классе пользователя:используя псевдоним или свойство вместо поля в django

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

Но я продолжаю получать FieldError ... Cannot resolve keyword 'username' into field

Я предполагаю, что это связано с поиска в БД. Есть ли другой способ добиться этого? Возможно, способ указать псевдоним fieldname?

ответ

0

get() вызывает QuerySet.filter(), создавая свойство не влияет на QuerySet, он работает только тогда, когда доступ приписать user экземпляра user.username.

Вы можете сделать это путем создания пользовательского QuerySet:

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'