2020年最新Django经典面试问题与答案汇总(上)-大江狗整理

article/2025/2/7 6:50:59

周末抽空整理了下Django经典面试问题及答案,希望对小伙伴们学习和工作有所帮助。如果小编我是负责招聘Python Web或Django开发人员的面试官,我也会考虑问如下问题。从下面可以大致了解一个面试者对Django技术的了解程度。由于篇幅所限,本文将分为上中下三部分发表,欢迎关注我们的微信公众号【Python Web与Django开发】

1. Django的优点和缺点有哪些?

Django的优点

  • 功能完善、要素齐全:自带大量企业Web开发常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站。

  • 完善的文档:经过十多年的发展和完善,Django有广泛的实践案例和完善的在线文档。开发者遇到问题时可以搜索在线文档寻求解决方案。

  • 强大的数据库访问组件:Django的Model层自带数据库ORM组件,使得开发者无须学习SQL语言即可对数据库进行操作。

  • Django先进的App设计理念: App是可插拔的,是不可多得的思想。不需要了,可以直接删除,对系统整体影响不大。

  • 自带台管理系统admin:只需要通过简单的几行配置和代码就可以实现一个完整的后台数据管理控制平台。

Django的缺点

  • 大包大揽: 对于一些轻量级应用不需要的功能模块Django也包括了,不如Flask轻便。

  • 过度封装: 很多类和方法都封装了,直接使用比较简单,但改动起来就比较困难。

  • 性能劣势: 与C, C++性能上相比,Django性能偏低,当然这是python的锅,其它python框架在流量上来后会有同样问题。

  • 模板问题: django的模板实现了代码和样式完全分离,不允许模板里出现python代码,灵活度对某些程序员来说可能不够。

2. 说说看Django的请求生命周期

注:最重要的是回答用户请求并不是一下子通过URL匹配就达到相应视图,返回数据也不是一下子就返回给用户,中间要经历层层中间件。这个面试题其实考的核心是中间件。

更多阅读:

Django基础(33): 中间件(middleware)的工作原理和应用场景举例

在生产环境,你还需要很清楚地描述下图流程。

3. 请列举几个Django ORM中常用的获取数据查询集(queryset)的方法

常用方法包括filter和exclude方法。字符串模糊匹配可以使用icontains, in等多种方法。随便举几个例子:

qs1 = Article.objects.filter(title__icontains='django')
qs2 = Article.objects.filter(id__range=[1,9])
qs3 = Article.objects.filter(id__in=[1, 3, 6, 7, 9])
qs4 = Article.objects.filter(author=request.user).exclude(id=1)

4. 说说看Django的Queryset有哪些特性

Django的QuerySet主要有两个特性:一是惰性的(lazy),二是自带缓存。我们来看个例子。

下例中article_list试图从数据库查询一个标题含有django的全部文章列表。

article_list = Article.objects.filter(title__contains="django")

但是当我们定义article_list的时候,Django的数据接口QuerySet并没有对数据库进行任何查询。无论你加多少过滤条件,Django都不会对数据库进行查询。只有当你需要对article_list做进一步运算时(比如打印出查询结果,判断是否存在,统计查询结果长度),Django才会真正执行对数据库的查询(见下例1)。这个过程被称为queryset的执行(evaluation)。Django这样设计的本意是尽量减少对数据库的无效操作,比如查询了结果而不用是计算资源的很大浪费。

# example 1
for article in article_list:print(article.title)

在例1中,当你遍历queryset(article_list)时,所有匹配的记录会从数据库获取。这些结果会载入内存并保存在queryset内置的cache中。这样如果你再次遍历或读取这个article_list时,Django就不需要重复查询了,这样也可以减少对数据库的查询。

更多阅读:

Django基础(12):深夜放干货。QuerySet特性及高级使用技巧,如何减少数据库的访问,节省内存,提升网站性能。

5. 什么是基于函数的视图(FBV)和基于类的视图(CBV)以及各自的优点

FBV(function base views) 就是在视图里使用函数处理请求。CBV(class base views) 就是在视图里使用类处理请求。Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View,可以让我们用类写View,这样做的优点主要下面两种:

  • 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)

  • 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

当然基于函数的视图也有自己的优点,比如对新手更友好。

更多阅读:

Django核心基础(3): View视图详解。一旦你使用通用视图,你就会爱上她。

6. 如何给基于类的视图(CBV)使用装饰器

需要借助django.utils模块的method_decorator方法实现,它还支持decorators列表, 如下所示:


from django.utils.decorators import method_decoratordecorators = [login_required, check_user_permission]@method_decorator(decorators, name='dispatch')
class ArticleCreateView(CreateView):model = Articleform_class = ArticleFormtemplate_name = 'blog/article_manage_form.html'

更多阅读:

Django基础(26): 常用装饰器应用场景及正确使用方法

一文看懂Python系列之装饰器(decorator)(工作面试必读)

7. 说说看使用基于类的视图(CBV)时get_queryset, get_context_data和get_object方法的作用

get_queryset()方法

正如其名,该方法可以返回一个量身定制的对象列表。当我们使用Django自带的ListView展示所有对象列表时,ListView默认会返回Model.objects.all()。

# Create your views here.
from django.views.generic import ListView
from .models import Articleclass IndexView(ListView):model = Article

然而这可能不是我们所需要的。当我们希望只展示作者自己发表的文章列表且按文章发布时间逆序排列时,我们就可以通过更具体的get_queryset方法来返回一个我们想要显示的对象列表。

# Create your views here.
from django.views.generic import ListView
from .models import Article
from django.utils import timezoneclass IndexView(ListView):template_name = 'blog/article_list.html'context_object_name = 'latest_articles'def get_queryset(self):return Article.objects.filter(author = self.request.user).order_by('-pub_date')

get_context_data()

get_context_data可以用于给模板传递模型以外的内容或参数,非常有用。例如现在的时间并不属于Article模型。如果你想把现在的时间传递给模板,你还可以通过重写get_context_data方法(如下图所示)。因为调用了父类的方法,

# Create your views here.
from django.views.generic import ListView
from .models import Article
from django.utils import timezoneclass IndexView(ListView):queryset = Article.objects.all().order_by("-pub_date")template_name = 'blog/article_list.html'context_object_name = 'latest_articles'def get_context_data(self, **kwargs):context = super().get_context_data(**kwargs)context['now'] = timezone.now() #只有这行代码有用return context

get_object()方法

DetailView和EditView都是从URL根据pk或其它参数调取一个对象来进行后续操作。下面代码通过DetailView展示一篇文章的详细信息。

# Create your views here.
from django.views.generic import DetailView
from django.http import Http404
from .models import Article
from django.utils import timezoneclass ArticleDetailView(DetailView):queryset = Article.objects.all().order_by("-pub_date") #等同于model = Articletemplate_name = 'blog/article_detail.html'context_object_name = 'article'

然而上述代码可能满足不了你的需求。比如你希望一个用户只能查看或编辑自己发表的文章对象。当用户查看别人的对象时,返回http 404错误。这时候你可以通过更具体的get_object()方法来返回一个更具体的对象。代码如下:

from django.views.generic import DetailView
from django.http import Http404
from .models import Article
from django.utils import timezoneclass ArticleDetailView(DetailView):queryset = Article.objects.all().order_by("-pub_date")template_name = 'blog/article_detail.html'context_object_name = 'article'def get_object(self, queryset=None):obj = super().get_object(queryset=queryset)if obj.author != self.request.user:raise Http404()return obj


8. 你能列举几个减少数据库查询次数的方法吗?

  • 利用Django queryset的惰性和自带缓存的特性

  • 使用select_related和prefetch_related方法在数据库层面进行Join操作

  • 使用缓存

更多阅读:

Django基础(29): select_related和prefetch_related的用法与区别

Django基础(8): 缓存Cache应用场景及工作原理,Cache设置及如何使用

9. Django的模型继承有哪几种方式? 它们有什么区别以及何时使用它们?

Django的模型继承有如下3种方式:

1. 抽象模型继承(abstract model)

2. 多表模型继承(multi-table inheritance)

3. 代理模型(proxy model)

它们的区别如下:

  • Django不会为抽象模型在数据库中生成自己的数据表。父类Meta中的abstract=True也不会传递给子类。如果你发现多模型有很多共同字段时,需使用抽象模型继承。

  • 多表模型继承与抽象模型继承最大的区别在于Django也会为父类模型建立自己的数据表,同时隐式地在父类和子类之间建立一个一对一关系。

  • 如果我们只想改变某个模型的行为方法,而不是添加额外的字段或创建额外的数据表,我们就可以使用代理模型(proxy model)。设置一个代理模型,需要在子类模型Meta选项中设置proxy=True, Django不会为代理模型生成新的数据表。

10. 说说看如何自定义模型标签(templatetags)和过滤器(filter)?

首先你要在你的app目录下新建一个叫templatetags的文件夹(不能取其它名字), 里面必需包含__init__.py的空文件。在该目录下你还要新建一个python文件专门存放你自定义的模板标签函数,本例中为blog_extras.py,当然你也可以取其它名字。整个目录结构如下所示:

blog/__init__.pymodels.pytemplatetags/__init__.pyblog_extras.pyviews.py

在模板中使用自定义的模板标签时,需要先使用{% load blog_extras %}载入自定义的过滤器,然后通过{% tag_name %} 使用它。

举例

我们将定义3个简单模板标签,一个返回string, 一个给模板context传递变量,一个显示渲染过的模板。我们在blog_extra.py里添加下面代码。

#blog_extra.py

from django import template
import datetime
from blog.models import Articleregister = template.Library()# use simple tag to show string
@register.simple_tag
def total_articles():return Article.objects.filter(status='p').count()# use simple tag to set context variable
@register.simple_tag
def get_first_article():return Article.objects.filter(status='p').order_by('-pub_date')[0]# show rendered template
@register.inclusion_tag('blog/latest_article_list.html')
def show_latest_articles(count=5):latest_articles = Article.objects.filter(status='p').order_by('-pub_date')[:count]return {'latest_articles': latest_articles, }


更多阅读:

Django基础(16): 模板标签(tags)的分类及如何自定义模板标签

Django实战: 利用自定义模板标签实现仿CSDN博客月度归档

喜欢本文的,欢迎收藏和点赞。希望获得更多干货的,别忘了关注我们的微信公众号【Python Web与Django开发】并加星标哦。

大江狗

2020.4.19


http://chatgpt.dhexx.cn/article/e4gHjxHB.shtml

相关文章

用HTML5制作的3D相册

HTML5 非常强大,尤其是和CSS3结合,有时候能达到非同凡响的网页动画效果。今天要分享的这款HTML5应用就是一款很酷的3D立体图片相册应用,它可以用鼠标多拽从多个角度浏览相册图片,点击图片,就可以放大图片,…

HTML5制作信息登记表

# 制作信息登记表#样式需求分析: 一、 通过最外层的大盒子对页面进行整体控制,设置宽高、背景图片及相对定位。 二、 通过标记对表单进行整体控制,对其设置宽高、边距、边框样式及绝对定位。 三、 通过 标记控制标题的文本样式,对其设置…

HTML5制作二级菜单(主菜单的子菜单)

HTML5制作二级菜单&#xff08;主菜单的子菜单&#xff09; 一、HTML文件代码二、 CSS文件代码三、效果图 一、HTML文件代码 <!--submenu.html--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><link r…

制作HTML5海报

一、HTML5海报有什么卵用&#xff1f; HTML5海报作用跟一般的海报差不多&#xff0c;但是拥有更生动的灵活的页面和便捷快速的传播途径&#xff08;网络&#xff09;。不仅可以在微信公众号中推广&#xff0c;也可以在票圈&#xff0c;空间&#xff0c;群上推广。做得好的海报&…

用html5和css制作信息登记表

<!doctype html> <html><head><meta charset"utf-8"><title>信息登记表</title><!-- <link rel"stylesheet" href"style07.css" type"text/css"> --><style type"text/css&q…

html5制作购物车页面,利用html来制作一个简单美观的购物车界面

首先来展示一下购物车界面: (学习视频分享:html视频教程) 这个页面只是实现了其布局视图,没有使用js或者jquery相关语言,在博主看来是比较利于我们将其加入到自己的程序中的以下是相关代码: index.html 商品名称单价数量操作旁氏洗发露991删除旁氏洗发露991<

html5制作圆形

代码如下 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Document</title> <style type"text/css"> .addBg { width: 100px; height: 100px; background-color…

html页面转盘如何实现,html5制作转盘的详解及实例

今天给大家带来的案列是html5转盘实例,可以直接拿来做抽奖程序,有需要的朋友可以拿去使用,下面是案列代码。html5制作转盘游戏 h1{width: 100%; height: 3rem; line-height: 3rem; font-size: 1.8rem; color:#c60; text-align: center; font-weight: bolder; } KinerLotter—…

用html做网页作品,HTML5实例:用HTML5制作的网页的15个优秀案例

在这里分享给大家精心挑选的15个HTML5网站模板&#xff0c;这些模板涉及商业、投资、简历、画廊、艺术、慈善、房地产&#xff0c;以及食品等等方面。 1. Zeni – Responsive HTML5 Portfolio Template Demo Download 2. Torn – HTML5 Template 5 Skins Demo Download 3. Fold…

用HTML5制作一个简易计算器

用H5制作一个简易计算器 最近刚学JavaScript&#xff0c;之后紧接着做了一个简易的计算器&#xff0c;能够实现数字的加减乘除运算。 首先&#xff0c;先用HTML5搭建好计算器大体框架。我这里用了两个表格&#xff0c;一个充当显示器&#xff0c;另一个表格就做成计算器按键部…

如何用html做一个贪吃蛇,如何用HTML5制作贪吃蛇游戏

如何用HTML5制作贪吃蛇游戏 发布时间:2020-07-09 15:09:59 来源:亿速云 阅读:122 作者:Leah 如何用HTML5制作贪吃蛇游戏?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 本文介绍了H5 c…

用HTML5制作精美战机游戏

每天要被大学老师催H5作业&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 不如看看本文&#xff0c;代码齐全&#xff0c;直接用来做参考案例&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; 代码…

用HTML5制作课程表

无论是上班族还是学生党&#xff0c;都需要一份类似课程表的表格来提醒我们的日程。有了它就可以不必担心自己忘记该干什么事情&#xff0c;到点了该干什么事情。它可以说是我们日常生活中经常接触的事物了&#xff0c;制作一份课程表也很简单&#xff0c;可以用纸写&#xff0…

使用HTML5制作的网页游戏-管道小鸟(附源码)

目录 1.整体项目框架 2.css样式 3. 游戏初始化 4.游戏结束提示 5.效果图​ 1.整体项目框架 2.css样式 *{padding: 0px;margin: 0px;}#game{width: 800px;height: 600px;background-image: url(img/bg.png);position: relative;overflow: hidden;/*溢出隐藏*/}#bird{width…

html做的小游戏,41个用HTML5制作完成的游戏作品

了解的人都应该知道HTML5有大量的动画和交互功能&#xff0c;完全可以用来完成一些游戏类的操作&#xff0c;今天收集分享&#xff1a;41个用HTML5制作完成的游戏作品&#xff0c;希望其中有你喜欢和需要的&#xff0c;或者可以给你带来灵感的。 1-Pirateslovedaisies 2-Torus …

John Petrucci-Wild Stringdom(1)

John Petrucci-Wild Stringdom(1) 第一章 练习导致完美 最能打击一个吉他手的事情&#xff0c;莫过于不能很快地达到自认为理所当然的水平而带来的焦虑。如果你经常在弹了数小时以后依然发现自己一无所获。那么这章就是专门为你写的。这章主要是概括了该如何练习的要点。当你开…

知识的迷宫 网络上的时间是如何度过的

作者&#xff1a;马伯庸 字数&#xff1a;1287 我在写一篇专栏文章&#xff0c;需要查阅一下关于宣武门的资料。   现在查资料比从前方便多了&#xff0c;只消在网上检索一下&#xff0c;立刻得到海量信息。于是很快我就得到了想要的资料&#xff0c;准备动笔写了。  …

蓝色默认蓝色色值_美丽的蓝色网站展示

每次您访问一个从未见过的网站时&#xff0c;第一印象是什么&#xff1f; 这是配色方案&#xff01; 颜色对任何用户而言都是最重要的。 颜色是影响个人感知的第一件事 &#xff0c;它以微妙的方式传达信息。 无论内容的质量如何&#xff0c;或网站的可用性如何&#xff0c;至…

130 余个相见恨晚的超实用网站,总有一个用得着

Python实战社群 Java实战社群 长按识别下方二维码&#xff0c;按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨Caesar 来源丨手机电脑双黑客 文章目录 130 余个相见恨晚的超实用网站搞学习找书籍冷知识 / 黑科技写代码资源搜索小工具导航页&…

设计一个简单HTML爵士音乐网页(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…