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

标签 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 不允许覆盖 parent 的领域。

如何设置字段?

最佳答案

虽然有一个答案已经满足了我想贡献的另一种方式,以更稳健的方式完成相同的任务。

如您所知,Django AbstractBaseUser 是应该用来替代 Django 用户类的基类。这样一个类继承自models.Modelwith是真正创建模型的类。

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

而这正是我们应该做的。正如您在 Python Data Model 上看到的那样您可以使用 metaclass 特殊属性来改变创建过程,如您所见。在您的情况下,您可以执行以下操作:

def myoverridenmeta(name, bases, adict):
    newClass = type(name, bases, adict)
    for field in newClass._meta.fields:
        if field.attname == 'last_login':
            field.column = 'last_login_date'
            field.db_column = 'last_login_date'
    return newClass

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

    __metaclass__ = myoverridenmeta

关于python - Django 自定义用户字段与 AbstractBaseUser 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27468136/

相关文章:

python - 带有空变量和 0 维对象数据框的 xarray 和 netCDF 文件

Python:两次调用 'curses' 会塞满我的终端

python - Python 虚拟环境中没有名为 MySqlDb 的模块

python - Gunicorn(Python3.4 和 3.3)仅在响应中发送没有数据的 header

javascript - Django/JQuery : can't stop Django form submission with JQuery (preventDefault(), 等不工作)

Django:返回 404 状态代码的自定义 404 处理程序

python - Django:覆盖模型中的插入、更新、删除

python - Django 图片上传不上传日语命名图片

python-3.x - 禁用 ModelMultipleChoiceField CheckBoxSelectMultiple Django 中的选择

python - 装饰器名称错误