Django自定义用户字段与AbstractBaseUser冲突

时间:2014-12-14 09:52:48

标签: python django django-models django-orm

我正在从现有数据库构建Django项目。其他系统正在使用该数据库,因此我无法更改其架构。这是我当前的自定义用户模型:

class Users(AbstractBaseUser):
    id_user = models.IntegerField(primary_key=True)
    role = models.IntegerField()
    username = models.CharField(max_length=50, unique=True)
    last_login_date = models.DateTimeField()

AbstractBaseUser需要一个名为last_login的列,而当前数据库表具有last_login_date列,其类似AbstractBaseUser.last_login。现在我需要在Users.last_login中使用该列:

    ...
    last_login = models.DateTimeField(_('last login'), default=timezone.now, column_name='last_login_date')
    ...

然而Django会抛出django.core.exceptions.FieldError: Local field 'last_login' in class 'Users' clashes with field of similar name from base class 'AbstractBaseUser',因为Django不允许覆盖父字段。

如何设置字段?

2 个答案:

答案 0 :(得分:3)

虽然有一个答案已经满足了我想要以更强大的方式实现相同任务的另一种方式的问题。

正如您所知,Django AbstractBaseUser是应该用来替换Django User Class的基类。这样的类继承自models.Model with是实际创建模型的类。

该类利用python数据模型的元类来改变创建过程。

这正是我们应该做的。正如您可以在Python Data Model上阅读的那样,您可以使用元类特殊属性来改变创建过程。在您的情况下,您可以完成以下操作:

R =:= HNil

答案 1 :(得分:1)

我无法找到一个好方法,所以我会给你两个相当不满意(但可行)解决方案 hacks:

  1. 不是继承自AbstractBaseUser,而是利用Django的开源代码并复制他们的AbstractBaseUser代码(它位于< ...> lib / python3.4 / site-packages / django / contrib /auth/models.py)并在last_login字段中使用column_name='last_login_date'直接实现它。 (AbstractBaseUser类也是here(版本1.7))

  2. 直接编辑< ...> lib / python3.4 / site-packages / django / contrib / auth / models.py(导致不可移植的代码在其他django安装时不起作用也是黑客攻击)