详解Django的 get_user_model() 函数:获取用户模型

  • Post category:Python

get_user_model()函数是Django中一个十分重要的函数,用于返回当前项目中的用户模型。该函数可以让我们在编写Django应用程序时避免对特定用户模型的依赖(例如,auth.User模型),而是使用可以自定义的用户模型。

该函数的作用是获取当前项目中使用的用户模型。默认情况下,Django使用预先定义的User模型,但是可以通过调用get_user_model()函数来加载自定义的用户模型。这个函数将返回与AUTH_USER_MODEL设置关联的用户模型。

使用get_user_model()函数有以下几个步骤:

  1. 在你的项目中导入get_user_model()函数: from django.contrib.auth import get_user_model
  2. 调用get_user_model()函数并将返回值分配给变量,例如:User = get_user_model()
  3. 使用变量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)