如何扩展django用户模型?

时间:2014-01-12 00:52:27

标签: python django model

我正在尝试从Users这样实现django.contrib.auth.models类:

from django.db import models
from django.contrib.auth.models import User


class Registration(models.Model):
    '''Represents a user registration.'''
    user              = models.ForeignKey(User)
    registration_date = models.DateTimeField(auto_now_add=True, help_text='The date of the registration')

    def __str__(self):
        return '%s - %s' % (self.user, self.registration_date,)

此用户默认启用两个属性:用户名,密码

screenshoot

the code阅读我可以看到有更多属性,如姓名和电子邮件。

我如何启用那些隐藏(如果这是正确的)属性?

1 个答案:

答案 0 :(得分:5)

首先,不隐藏这些属性。假设您的INSTALLED_APPS中有“django.contrib.auth”和“django.contrib.contenttypes”,则您可以访问链接中定义的User模型。有关如何使用/访问它的文档,请参阅here

但是,由于您指定了扩展 User模型,我希望您希望为其添加一些自己的字段(即使您的示例registration_date存在且是可通过myuser.date_joined)访问。


更老,更稳定,更常见的做法与您所拥有的相似。唯一的区别是使用OneToOneField(User)代替ForeignKey(User)。这通过强制关系使双向和更方便的关系。您需要确保为每个创建的Registration创建一个User对象。

事实上,OneToOneField的文档中正好有an example

from django.db import models
from django.contrib.auth.models import User

class Registration(models.Model):
    user = models.OneToOneField(User)
    registration_date = models.DateTimeField(auto_now_add=True)

>>> user = User.objects.get(pk=1)
>>> registration = Registration.objects.create(user=user)
>>> user.registration.registration_date
# Should give the current time
>>> user.get_full_name()
# Should also have all those *hidden* attributes linked above

从Django 1.5开始,您可以非常轻松地使用自己的自定义用户模型。此功能的文档为here。如果您只是添加一些额外的字段,那么您可以继承User模型并添加自己的字段。

from django.db import models
from django.contrib.auth.models import AbstractUser

class MyUser(AbstractUser):
    # We inherit all those nifty things from AbstractUser
    registration_date = models.DateTimeField(auto_now_add=True)

然后通过添加AUTH_USER_MODEL = 'myapp.MyUser'在settings.py中启用它。我们现在必须以稍微不同的方式访问用户模型

>>> from django.contrib.auth import get_user_model()
>>> Users = get_user_model()
>>> user = Users.objects.get(pk=1)
>>> user.registration_date
# Should give the current time
>>> user.get_full_name()
# Should have those 'hidden' attributes

所有这些都可以在文档中的用户模型的extendingsubstituting下找到。