gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:49 25 4
gpt4 key购买 nike

我正在从现有数据库构建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com