详解Django的 get_object() 函数:获取视图所处理的对象

  • Post category:Python

Django中get_object()函数的作用

在Django框架中,get_object()函数的作用是从指定的模型(Model)中返回一个对象实例,如果找不到则会抛出一个Http404的异常。get_object()函数通常用于用于在视图(View)中获取模型(Model)的单个实例,例如用于显示单篇文章、单个产品的详细信息等。

Django中get_object()函数的使用方法

get_object()函数可以在Django自带的DetailView类中使用,也可以在自定义的视图中使用。它的使用方法如下:

  1. 定义一个Url,用于访问需要获取的单个对象的详细信息的页面,例如文章的详情页面:
from django.urls import path
from .views import ArticleDetailView

urlpatterns = [
  path('article/<int:pk>/', ArticleDetailView.as_view(), name='article_detail'),
]
  1. 定义一个视图类,继承Django自带的DetailView类,并指定需要获取对象的模型(Model),例如:
from django.views.generic import DetailView
from .models import Article

class ArticleDetailView(DetailView):
  model = Article
  template_name = 'article_detail.html'

需要注意,DetailView类需要指定model属性,指定需要获取的模型(Model)类,而在Url中需要传入视图的Pk值,这个Pk值将会传给get_object()方法,以此去查找需要显示的对象,如果找不到则会抛出一个Http404的异常。

  1. 在模型(Model)的管理器(Manager)中创建get_object()函数,例如:
from django.db import models

class ArticleManager(models.Manager):
    def get_object(self, pk):
        return self.get(pk=pk)

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = ArticleManager()

上述代码中,我们定义了一个自定义的ArticleManager类,其中定义了get_object()函数,它通过pk值查找单个Article对象实例。在Article模型类中,我们使用objects管理器对象实例化自定义的ArticleManager类。

实例说明

下面提供两个具体的实例说明get_object()函数的使用方法。

实例一:展示单篇文章的详细信息

我们先创建一个模型(Model)用于表示文章的数据,定义以下字段:

from django.db import models
from django.urls import reverse

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    published_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('article_detail', args=[str(self.id)])

上述代码中,我们为Article类添加了get_absolute_url()函数,该函数会通过reverse()函数返回访问该文章详情页面的URL。

现在我们需要添加详细信息的视图(View):

from django.shortcuts import render
from django.views.generic import DetailView
from .models import Article

class ArticleDetailView(DetailView):
  model = Article
  template_name = 'article_detail.html'

上述代码中,我们使用了Django提供的DetailView类,并指定需要获取的模型(Model)类。

最后我们再创建一个Url,用于访问单篇文章的详情页面:

from django.urls import path
from .views import ArticleDetailView

urlpatterns = [
  path('article/<int:pk>/', ArticleDetailView.as_view(), name='article_detail'),
]

实例二:展示单个用户的详细信息

我们创建一个模型(Model)用于表示用户的数据,定义以下字段:

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

class CustomUser(AbstractUser):
    age = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('user_detail', args=[str(self.id)])

上述代码中,我们创建了一个CustomUser类,继承了Django内置的AbstractUser类,并在CustomUser中添加了age字段。同时,我们也为CustomUser类添加了get_absolute_url()函数。

现在我们需要添加用户详细信息的视图(View):

from django.shortcuts import render
from django.views.generic import DetailView
from .models import CustomUser

class UserDetailView(DetailView):
  model = CustomUser
  template_name = 'user_detail.html'

上述代码中,我们使用了Django提供的DetailView类,并指定需要获取的模型(Model)类。

最后我们再创建一个Url,用于访问单个用户的详情页面:

from django.urls import path
from .views import UserDetailView

urlpatterns = [
  path('user/<int:pk>/', UserDetailView.as_view(), name='user_detail'),
]

以上两个实例就是get_object()函数的使用方法。我们可以使用get_object()函数来快速地在视图中获取单个模型(Model)的详细信息。