【问题标题】:using an alias or property in place of a field in django使用别名或属性代替 django 中的字段
【发布时间】:2013-06-19 12:02:45
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2014-05-01
      • 2011-12-04
      • 1970-01-01
      • 2017-05-06
      • 2013-12-26
      相关资源
      最近更新 更多