get_user_model()
函数是Django中一个十分重要的函数,用于返回当前项目中的用户模型。该函数可以让我们在编写Django应用程序时避免对特定用户模型的依赖(例如,auth.User
模型),而是使用可以自定义的用户模型。
该函数的作用是获取当前项目中使用的用户模型。默认情况下,Django使用预先定义的User
模型,但是可以通过调用get_user_model()
函数来加载自定义的用户模型。这个函数将返回与AUTH_USER_MODEL
设置关联的用户模型。
使用get_user_model()
函数有以下几个步骤:
- 在你的项目中导入
get_user_model()
函数:from django.contrib.auth import get_user_model
- 调用
get_user_model()
函数并将返回值分配给变量,例如:User = get_user_model()
- 使用变量
User
替代User
模型来引用用户模型。例如,您可以像这样查询所有用户:all_users = User.objects.all()
下面提供两个使用get_user_model()
函数的示例:
示例1:
我们创建了一个名为accounts
的应用程序来设置自定义的用户模型。accounts/models.py
中的代码如下:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('Enter your email please')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(email, password, **extra_fields)
class User(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
objects = UserManager()
def __str__(self):
return self.email
然后我们在settings.py
文件中添加以下代码来指定我们的用户模型:
AUTH_USER_MODEL = 'accounts.User'
我们可以像下面这样在视图中使用get_user_model()
函数:
from django.contrib.auth import get_user_model
from django.shortcuts import render
def user_list(request):
User = get_user_model()
users = User.objects.all()
return render(request, 'users_list.html', {'users': users})
示例2:
我们创建了一个名为app1
的应用程序,该应用程序使用了默认的用户模型 auth.User
。在app1/views.py
中,我们有如下代码:
from django.contrib.auth.models import User
from django.http import HttpResponse
def get_users(request):
users = User.objects.all()
return HttpResponse(users)
在app2
应用程序中我们定义了一个自定义用户模型,并加入了一个自定义字段 location
。在app2/models.py
中,我们有如下代码:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
location = models.CharField(max_length=100, blank=True)
然后在settings.py
文件中,我们指定了自定义用户:
AUTH_USER_MODEL = 'app2.CustomUser'
我们可以像下面这样在视图中使用get_user_model()
函数:
from django.contrib.auth import get_user_model
from django.http import HttpResponse
def get_custom_users(request):
User = get_user_model()
users = User.objects.all()
return HttpResponse(users)