Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 django generic.DetailView 里设置缓存(重写 get_object )

在 django generic.DetailView 里设置缓存(重写 get_object )

作者头像
卓越笔记
发布于 2023-02-18 06:03:23
发布于 2023-02-18 06:03:23
36800
代码可运行
举报
文章被收录于专栏:卓越笔记卓越笔记
运行总次数:0
代码可运行

开发环境

  • django 1.11

DetailView  的相关源码

# ..\Lib\site-packages\django\views\generic\dates.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView):
    """
    Detail view of a single object on a single date; this differs from the
    standard DetailView by accepting a year/month/day in the URL.
    """
    template_name_suffix = '_detail'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView):
    """
    Detail view of a single object on a single date; this differs from the
    standard DetailView by accepting a year/month/day in the URL.
    """
    def get_object(self, queryset=None):
        """
        Get the object this request displays.
        """
        year = self.get_year()
        month = self.get_month()
        day = self.get_day()
        date = _date_from_string(year, self.get_year_format(),
                                 month, self.get_month_format(),
                                 day, self.get_day_format())

        # Use a custom queryset if provided
        qs = self.get_queryset() if queryset is None else queryset

        if not self.get_allow_future() and date > datetime.date.today():
            raise Http404(_(
                "Future %(verbose_name_plural)s not available because "
                "%(class_name)s.allow_future is False."
            ) % {
                'verbose_name_plural': qs.model._meta.verbose_name_plural,
                'class_name': self.__class__.__name__,
            })

        # Filter down a queryset from self.queryset using the date from the
        # URL. This'll get passed as the queryset to DetailView.get_object,
        # which'll handle the 404
        lookup_kwargs = self._make_single_date_lookup(date)
        qs = qs.filter(**lookup_kwargs)

        return super(BaseDetailView, self).get_object(queryset=qs)

# ..\Lib\site-packages\django\views\generic\detail.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SingleObjectMixin(ContextMixin):
    """
    Provides the ability to retrieve a single object for further manipulation.
    """
    model = None
    queryset = None
    slug_field = 'slug'
    context_object_name = None
    slug_url_kwarg = 'slug'
    pk_url_kwarg = 'pk'
    query_pk_and_slug = False

    def get_object(self, queryset=None):
        """
        Returns the object the view is displaying.

        By default this requires `self.queryset` and a `pk` or `slug` argument
        in the URLconf, but subclasses can override this to return any object.
        """
        # Use a custom queryset if provided; this is required for subclasses
        # like DateDetailView
        if queryset is None:
            queryset = self.get_queryset()

        # Next, try looking up by primary key.
        pk = self.kwargs.get(self.pk_url_kwarg)
        slug = self.kwargs.get(self.slug_url_kwarg)
        if pk is not None:
            queryset = queryset.filter(pk=pk)

        # Next, try looking up by slug.
        if slug is not None and (pk is None or self.query_pk_and_slug):
            slug_field = self.get_slug_field()
            queryset = queryset.filter(**{slug_field: slug})

        # If none of those are defined, it's an error.
        if pk is None and slug is None:
            raise AttributeError("Generic detail view %s must be called with "
                                 "either an object pk or a slug."
                                 % self.__class__.__name__)

        try:
            # Get the single item from the filtered queryset
            obj = queryset.get()
        except queryset.model.DoesNotExist:
            raise Http404(_("No %(verbose_name)s found matching the query") %
                          {'verbose_name': queryset.model._meta.verbose_name})
        return obj

看了源码发现 get_object,就是返回 单一的对象,相当于 return YouModel.objects.get(pk='pk') 

重写 generic.DetailView 里面的 get_object

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class DetailView(generic.DetailView):
    model = Article  # 模型名称
    template_name = 'lw-article.html' # 模板名称
    context_object_name = "article" # 传递给模板的变量名称

    def get_object(self, queryset=None):
        """
        Get the object this request displays. 获取对应文章的信息
        """
        # 文章详情增加缓存
        pk = self.kwargs.get(self.pk_url_kwarg)  # 获取主键
        obj = cache.get("article_obj_%s" % pk)  # 获取该主键的缓存
        if not obj:  # 如果没有就
            obj = super(DetailView, self).get_object()  # get_object() 重新获取单个对象
            cache.set("article_obj_%s" % pk, obj, CACHE_TIMEOUT_2D)  # 设置该主键的缓存

        return obj
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-2-27 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django来敲门~第一部分【9.使用Django内置视图处理对象简化开发】
首先,要说这是Django基础部分的最后一个章节了。后面会详细讲解Django每一部分的使用方式和API了
大牧莫邪
2018/08/27
1.1K0
Django内置的通用类视图及实例
表示对象列表的一个页面. 执行这个视图的时候,self.object_list将包含视图正在操作的对象列表(通常是一个查询集,但不是必须). 属性:
菲宇
2019/06/13
3.5K0
Django内置的通用类视图及实例
Django内置的通用类视图CBV及示例
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
菲宇
2019/10/22
3.8K0
Django内置的通用类视图CBV及示例
Python-Django
一般在urls.py中配置url,在models.py中配置model,在views.py中配置View。
py3study
2020/01/03
8460
Django2.0中文(通用视图)
1、通用视图 urls.py: from django.views.generic import TemplateView path(r'about/',TemplateView.as_view(template_name="about.html")), 2、通用视图 about.html xx/templates/about.html
用户5760343
2022/05/14
8800
基于类的通用视图:ListView 和 DetailView
在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑是一样的。比如一个博客和一个论坛,通常其首页都是展示一系列的文章列表或者帖子列表。对处理首页的视图函数来说,虽然其处理的对象一个是文章,另一个是帖子,但是其处理的过程是非常类似的。首先是从数据库取出文章或者帖子列表,然后将这些数据传递给模板并渲染模板。于是,Django 把这些相同的逻辑代码抽取了出来,写成了一系列的通用视图函数,即基于类的通用视图(Class Based View)。 使用类视图是 Django 推荐的做法,而且熟悉
追梦人物
2018/04/17
3K0
Django(55)GenericAPIView源码分析
GenericAPIView继承自APIView,也就是在APIView基础上再做了一层封装,源码如下:
全栈程序员站长
2022/09/16
4370
从入门到"精通"Django REST Framework-(五)
GenericAPIView 是 Django REST Framework (DRF) 中的一个基础视图类,它继承自 APIView,并添加了一些常用的功能,特别是与数据库模型交互的功能。它是 DRF 中通用视图和视图集的基础,提供了查询、序列化、分页等常用操作的标准实现。本质上它是 DRF 中所有通用视图(如 ListAPIView、RetrieveAPIView 等)的基础。
rxg456
2025/03/01
3830
从入门到"精通"Django REST Framework-(五)
Django源码学习-8-ListView&DetailView通用视图
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/08/06
1.6K0
django 1.8 官方文档翻译: 3-4-2 内建显示视图
编写Web应用可能是单调的,因为你需要不断的重复某一种模式。 Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历这种厌烦。
ApacheCN_飞龙
2022/11/27
1.8K0
Django开发网页计数器统计页面浏览次数
实际Web开发过程中,我们经常要统计并显示一个页面的浏览次数。今天我们会以博客的例子,教你如何利用Django开发网页计数器,统计并显示一篇文章的浏览次数。本文的原理可以适用于很多场景,比如统计某一文件的下载次数,统计某一用户在单位时间内的登录次数。本文使用Django 2.0 + Python 3.X实现。
菲宇
2019/06/13
2.3K0
Django开发网页计数器统计页面浏览次数
基于python开发的口罩供需平台
该项目是基于python的web类库django开发的一套web网站,做为一个公益项目。
西门吹雪1997
2020/03/18
6880
Django实战篇-论坛回帖视图
使用 Django 的模型,都是 django.db.models.Model 类的子类。
小团子
2019/07/18
6380
Django实战篇-论坛回帖视图
Django REST framework+Vue 打造生鲜超市(四)
五、商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view 利用Django的view实现返回json数据 # goods/view_base.py from django.views.generic import View from goods.models import Goods class GoodsListView(Vie
zhang_derek
2018/04/11
4.9K0
Django REST framework+Vue 打造生鲜超市(四)
rest_framework -- mi
上面的mixins、generics都是rest_framework里的模块,我们可以继承其中的某些类,达到代码量减少的效果,这里充分体现出了面向对象的继承 一、mixins模块 mixins : from rest_framework import mixins #导入方式 存放一些增删改查的一些类 CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelM
py3study
2020/01/19
6380
基于django的视频点播网站开发-step5-详情页功能
在本讲中,我们开始详情页功能的开发,详情页就是对单个视频进行播放并展示视频的相关信息,比如视频标题、描述、评论信息、相关推荐等。我们将会学习到通用视图类DetailView的使用、评论动态加载、以及如何通过ajax实现喜欢和收藏功能,并通过一段段很酷的代码来说明这些功能。
西门吹雪1997
2019/02/13
2.3K0
测试开发进阶(二十七)
projects.serializer.ProjectModelSerializer中添加
zx钟
2019/10/23
6740
测试开发进阶(二十七)
基于 Django 的个人网站(4)
考虑到分类页面是一个用来展示属于当前类别的所有文章,和首页一样的格式,就是显示的列表项十有八九会比首页少,因此分类页面的视图直接继承首页的视图,然后重写 get_queryset 方法就完事了,代码如下:
不可言诉的深渊
2020/05/27
1.3K0
测试开发进阶(二十八)
进入 get_object_or_404可以看到一个解包,这样就拿到了查询集中 id=1的内容
zx钟
2019/10/25
8480
django 学习笔记四
通用视图模式 from django.views import generic class IndexView(generic.ListView): template_name = 'polls/index.html' context_object_name = 'latest_question_list' def get_queryset(self): ''' return the last five pulished quesitons.'''
onety码生
2018/11/21
2780
相关推荐
Django来敲门~第一部分【9.使用Django内置视图处理对象简化开发】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档