我正在尝试从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,)
此用户默认启用两个属性:用户名,密码
在the code阅读我可以看到有更多属性,如姓名和电子邮件。
我如何启用那些隐藏(如果这是正确的)属性?
答案 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
所有这些都可以在文档中的用户模型的extending和substituting下找到。