如何扩展django用户模型?

Luc*_*cio 0 python django model

我正在尝试像这样实现Usersdjango.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,)
Run Code Online (Sandbox Code Playgroud)

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

screenshoot

阅读代码我可以看到有更多属性,如姓名和电子邮件.

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

kal*_*rtt 5

首先,这些属性不会被隐藏.假设您有"django.contrib.auth"和"django.contrib.contenttypes" INSTALLED_APPS,那么您可以访问User链接中定义的模型.有关如何使用/访问它的文档,请参见此处.

不过,既然你指定的扩展User模型,我希望你想一些自己的字段添加到它(即使你的例子registration_date存在并且可访问通过myuser.date_joined).


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

事实上,在OneToOneField的文档中有一个确切的内容.

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
Run Code Online (Sandbox Code Playgroud)

从Django 1.5开始,您可以非常轻松地使用自己的自定义用户模型.此功能的文档在此处.如果您只是添加一些额外的字段,那么您可以继承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)
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

所有这些都可以在扩展替换文档中的用户模型时使用.