我正在从现有数据库构建 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 不允许覆盖父级的字段。
字段如何设置?
尽管有一个答案已经满足了问题,但我想以另一种方式做出贡献,以更稳健的方式实现相同的任务。
如您所知,Django AbstractBaseUser 是应该用来替代 Django User Class 的基类。这样的类继承自 models.Model ,并且是实际创建模型的类。
此类利用 python 数据模型的元类来改变创建过程。
这正是我们应该做的。正如您可以继续阅读的那样Python数据模型 https://docs.python.org/2/reference/datamodel.html#customizing-class-creation您可以使用元类如您所见,可以改变创建过程的特殊属性。对于您的情况,您可以执行以下操作:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)