Django框架面试题

文章目录

        • 1.django创建项目的命令
        • 2.django创建项目后,项目文件夹下的组成部分
        • 3.对MVC、MVT的理解
        • 4.django中models利用ORM对MySQL进行查表的语句
        • 5.Django中间件的使用
        • 6.浅谈你对uWSGI和nginx的理解
        • 7.nginx和uWSGI服务器之间如何配合工作的?
        • 8.django开发中数据库做过什么优化?
        • 9.验证码过期时间怎么设置?
        • 10.python中django框架的应用场景
        • 11.django如何提高性能(高并发)
        • 12.什么是restful api,谈谈你的理解
        • 13.什么是csrf攻击原理?如何解决?
        • 14.启动Django服务的方法
        • 15.怎么测试Django框架中的代码?
        • 16.有过部署经验吗?用的什么技术?
        • 17.Django中哪里用到了线程?哪里用到了协程?哪里用到了进程?
        • 18.django关闭浏览器,怎么清除cookie和session?
        • 19.代码优化方面怎么考虑?有什么想法?
        • 20.celery分布式任务队列
        • 21.Jieba分词
        • 22.简述Django下的(内建的)缓存机制
        • 23.Django中HTTP请求的处理流程(请求的生命周期)
        • 24.django 中当一个用户登录 A 应用服务器(进入登录状态),然后下次请求被 nginx代理到 B 应用服务器会出现什么影响?
        • 25.Django重定向是怎么实现的?用的什么状态码?
        • 26.Django 本身提供了 runserver,为什么不能用来部署
        • 27.电商网站库存问题
        • 28.什么是反向解析
        • 29.Django 日志管理
        • 30.列举django的内置组件?
        • 31.select_related和prefetch_related的区别?
        • 32.django ORM中三种能写SQL语句的方法
        • 33.如何使用Django ORM批量创建数据库?
        • 34.django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新
        • 35.django的Model中的ForeignKey字段中的on_delete参数有什么作用?
        • 36.Django中间件与装饰器的区别

1.django创建项目的命令

答: django-admin startproject [项目名称]
python manage.py startapp [应用app名]

2.django创建项目后,项目文件夹下的组成部分

答: 文件组成:manage.py、__init__.py、setting.py、urls.py、wsgi.py
manage.py:项目运行的日寇,指定配置文件路径。与项目同名的目录,包含项目的配置文件
__init__.py:空文件,作用是这个目录可以被当作包使用
settings.py:是项目的整体配置文件
wsgi.py:是项目与WSGI兼容的web服务器

3.对MVC、MVT的理解


MVC:M(model)模型,作用:与数据进行交互;V(view)视图,作用:负责产生HTML页面;C(controller)控制器,作用:接收请求,进行处理,与M和V进行交互,返回应答
MVC步骤:假设是一个注册页面,用户点击注册按钮,要把注册的信息发送给网站服务器;controller控制器接收到用户的注册信息,controller会告诉model层将用户的注册信息保存到数据库;model层将用户的注册信息保存到数据库;数据保存之后将保存的结果返回给model模型;model层将保存的结果返回给controller控制器;controller控制器收到保存的结果之后,告诉view视图,view视图产生一个HTML页面;view将产生的HTML页面的内容返回给controller控制器;controller将HTML页面的内容返回给浏览器;浏览器接收到服务器controller返回的HTML页面进行解析展示。
MVT:M(model)模型,作用:与数据库进行交互;V(view)视图,作用:接收请求,处理请求,与M和T 进行交互,返回应答;T(template)模板,作用:产生HTML页面
MVT步骤:结社是一个注册页面,用户点击注册按钮,将要注册的内容发送给网站的服务器;view视图接收到用户发来的注册信息,view告诉model将用户的注册信息保存进数据库;model层将用户的注册信息保存到数据库;数据库将保存的结果返回给model层;model层将保存的结果给view视图;view视图告诉template模板产生一个HTML页面;template生成的HTML内容返回给view视图;view将HTML页面内容返回给浏览器;浏览器拿到view返回的HTML页面内容进行解析展示。

4.django中models利用ORM对MySQL进行查表的语句

持久化:把数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储到磁盘文件、XML数据文件中等等
持久层:专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。
ORM:即object-relationl mapping,作用是在关系型数据库和对象之间作一个映射,这样就可以在操作数据库的时候不用和复杂的SQL语句打交道,只要像平时操作对象一样操做就可以了。
ORM优缺点:优点:开发效率高;数据访问更抽象、轻便;支持面向对象封装;
缺点:降低程序的执行效率;思维固定化


字段查询

all()		返回模型类对应表格中的所有数据
get()		返回表格中满足条件的一条数据,如果查到多条数据,抛出异常MultipleObjectsReturned;如果查询不到数据,抛出异常DoesNotExist
filter()	参数查询条件,返回满足条件QuerySet集合数据
格式:[模型类属性名].object.filter([条件名]=[值])		如:BookInfo.object.filter(id=1)
		
contains	查询包含某字符串的内容
例:BookInfo.objects.filter(btitle__contains='传')
isnull		空查询
例:BookInfo.objects.filter(btitle__isnull=False)
in()			范围查询
例:BookInfo.objects.filter(id__in=[1, 3, 5])
gt大于  lt小于  gte大于等于  lte小于等于   比较查询
例:BookInfo.objects.filter(id__gte=3)
bpub_date	日期查询
例:BookInfo.objects.filter(bpub_date__year=1980)
例:BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude	返回不满足条件的数据
例:BookInfo.objects.exclude(id=3)

F对象:用于类属性之间的比较

from django.db.models import F
# 查询阅读量大于评论量的信息 bread>bcpmment
BookInfo.objects.filter(bread__gr=F('bcomment'))

Q对象:用于查询时的逻辑条件,可以用&|~操作

from django.db.models import Q
# 查询id大于3或者阅读大于30的信息
BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))

order_by返回QuerySet,对查询结果进行排序

BookInfo.objects.all().order_by('-id')

聚合函数,对查询结果进行聚合操作sum count max min avg
aggregate:调用这个函数来使用聚合

from django.db.models import Sum, Count, Max, Min, Avg
BookInfo.objects.aggregate(Count('id'))

模型类关系

  • 一对多关系models.ForeignKey()
  • 多对多关系models.ManyToManyField()
  • 一对一关系models.OneToOneField()

5.Django中间件的使用

**答:**Django在中间件中预置了6个方法,着6个方法的去呗在于不同的阶段执行,对输入或输出进行干预。
示例:

class CommonMiddleware(object):
	def process_request(self, request):
		return None
		
	def process_response(self, request, response):
		return response
  1. 初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启动当前中间件。
def __init__():
	pass
  1. 处理请求前:在每个请求上调用,返回None或HttpResponse对象
def process_request(request):
	pass
  1. 处理视图前:在每个请求上调用,返回None或HttpResponse对象
def process_view(request, view_func, view_args, view_kwargs):
	pass
  1. 处理模板响应前:在每个请求上调用,返回实现了render方法的响应的对象。
def process_template_response(request, response):
	pass
  1. 处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
def process_response(request, response):
	pass
  1. 异常处理:当视图排除异常时调用,在每个请求上调用,返回一个HttpResponse对象
def process_exception(request, exception):
	pass

6.浅谈你对uWSGI和nginx的理解

答: uWSGI是一个web服务器,它实现了WSGI协议、uwsgi、http等协议。nginx中HttpUwsgiModele的作用是域uWSGI服务器进行交换。WSGI是一种web服务器网关接口,它是一个web服务器与web应用通信的一种规范。

WSGI、uwsgi、wWSGI的区别
WSGI是一种通信协议
uwgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信
uWSGI是实现了uwsgi和WSGI两种协议的web服务器

nginx是一个开源的高性能的HTTP服务器和反向代理;作为web服务器,它处理静态文件和索引文件效果非常好;塔的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间;稳定想高,配置简洁;强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用。

7.nginx和uWSGI服务器之间如何配合工作的?

**答:**首先浏览器发起HTTP请求到nginx服务,nginx根据接收到的请求,进行url分析,判断访问的资源类型,如果是静态资源,直接读取静态资源返回给浏览器,如果请求的是动态资源就转交给uWSGI服务器,uWSGI服务器根据自身的uwsgi和WSGI协议,找到对应的django框架,django框架下的应用进行逻辑处理后,将返回值发送到uWSGI服务器,然后uWSGI服务器再返回给nginx,最后nginx将返回值返回给浏览器进行渲染显示给用户。

8.django开发中数据库做过什么优化?

答:

  1. 设计表的时,尽量少使用外键,因为外键约束会影响插入和删除性能
  2. 使用缓存,减少对数据库的访问
  3. 再ORM框架下设置表时,能用varchar确定字段长度时,就别用text
  4. 可以给搜索频率吧高的字段属性,在定义时创建索引
  5. django ORM框架下的Querysets本来就有缓存的
  6. 如果一个页面需要多次连接数据库,最好一次性取出所有需要的数据,减少对数据据的查询次数
  7. 若页面只需要数据库里某一个两个字段时,可以用Queryset.values()
  8. 在模板标签中使用with标签可以缓存Queryset的查询结果

9.验证码过期时间怎么设置?

**答:**将验证码保存到数据库或者session中,设置过期时间为1分钟,然后页面设置一个倒计时的展示,一分钟过后再次点击获取新的信息

10.python中django框架的应用场景

答: django主要是用来搞快速开发的,他的两点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实现HTTP的通信,底层用纯C、C++写提升效率,ORM框架也去掉,自己编写封装与数据库交互的框架,因为ORM的效率真的很低。

11.django如何提高性能(高并发)

**答:**提高性能往往指的是:并发数和响应时间
对于网站应能的优化一般包括:web前端性能优化,应用服务器性能优化,存储服务器优化。
关于前端的优化:

  • 减少http请求,减少数据库的访问,比如使用雪碧图
  • 使用浏览器缓存,将一些常用的css,js,logo图标,这些静态资源缓存到本地浏览器,通过设置http投中的cache-control和expires的属性,可设定浏览器缓存,缓存时间可以自定义。
  • 对HTML,css,JavaScript文件进行压缩,减少网络的通信量。
    其他优化:
  • 合理的使用缓存技术,对一些常用到的动态数据,比如首页做一个缓存,或者某些常用的数据做个缓存,设置一定的过期时间,这样减少了对数据库的压力,提升网站性能
  • 使用celery消息队列,将耗时的操作扔到队列中,让worker去监听队列里的任务,实现异步操作,比如发邮件发短信等
  • nginx部署项目优化,配置合适的参数,可以提升效率,增加并发量
  • 搭建服务器集权,将并发访问请求,分散至多态服务器上处理

12.什么是restful api,谈谈你的理解

答: REST:representational state transfer的缩写,具象状态传输,一般解释为表现层状态转换
REST是设计风格而不是标准,是指客户端和服务器的交互形式,我们需要关注的重点是如何设计REST风格的网络接口。
特点:

  1. 具象的,表现层,要表现的对象就是资源。比如:客户端访问服务器,获取的数据就是资源。
  2. 表现:资源的表现形式,txt格式、HTML格式、json格式、jpg格式等。浏览器通过URL确定资源的位置,但是需要再HTTP请求头中,用accept和content-type字段指定,这两个字段是对资源表现的描述
  3. 状态转换,客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转化。其中GET表示获取资源,POST表示新建资源,PUT表示更新资源,DELETE表示删除资源
    RESTful架构:
    (1)每个URL代表一种资源
    (2)客户端和服务器之间,传递这种资源的某种表现层
    (3)客户端通过四个HTTP动词,对服务器资源进行操作,实现表现层状态转换

13.什么是csrf攻击原理?如何解决?

答: 访问信任网站A,A会保存你的个人信息并返回给浏览器一个cookie,然后再cookie过期时间之内,访问了恶意网站B,B返回一些恶意请求代码,要求浏览器去访问A,浏览器再收到这个请求之后,就会直接带上保存到本地的cookie信息去访问网站A,然后网站A以为是用户本身的操作,导致来自恶意网站B的攻击代码被执行,导致个人信息隐私泄露和财产安全受到威胁。
解决办法:

  • 验证HTTP Referer字段。在HTTP投中有一个字段Referer,记录了该HTTP请求的来源地址,在通常情况下,访问一个安全首先页面的请求来自于同一个网站,如果referer是其他网站,则可能是CSRF攻击,拒绝该请求。
  • 在请求地址中添加token并验证。要低于CSRF攻击,关键在于请求中放入不能伪造的信息,并且该信息不存在于cookie之中。可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端简历一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。
  • 在HTTP头中自定义属性并验证。这中方法也是使用token并进行验证,但是不同的是,这里没有把token以参数的形式置于HTTP请求之中,而是把它放在HTTP头中自定义的属性中。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。

跨域请求问题 django 怎么解决的
启用中间件;post 请求;验证码;表单中添加 csrf_token 标签

14.启动Django服务的方法

答: runserver方法是调试Django时经常用到的运行方式,它使用Django自带的WSGI Server运行,主要用于测试和开发中使用,并且runserver开启的方式也是单进程的

15.怎么测试Django框架中的代码?

答: 在单元测试方面,django继承python的unittest.TestCase实现自己的django.test.TestCase,编写测试用例一般从这里开始,测试代码位于app中的tests.py文件中。

python manage.py test	# 执行所有的测试用例
python manage.py test app_name		# 执行该app的所有测试用例
python manage.py test app_name.case_name	# 执行指定的测试用例

测试工具:unittest或pytest

16.有过部署经验吗?用的什么技术?

答: 部署经验在阿里云服务器上部署的
技术:nginx+ uwsgi的方式来部署django项目

17.Django中哪里用到了线程?哪里用到了协程?哪里用到了进程?

答: django中好事的任务用一个进程或线程来执行,比如邮件发送,使用celery
部署django项目的时候,配置文件中设置了金长城和线程的相关配置

18.django关闭浏览器,怎么清除cookie和session?

答:
设置读取cookie

def cookie_set():
	# 设置cookie
	response = HttpResponse('

设置cookie,请查看响应报文头

'
) response.set_cookie('h1', 'hello django') def cookie_get(request): # 读取cookie response = HttpResponse('读取cookie,数据如下:
'
) if response.COOKIES.has_key('h1'): response.write(request.COOKIES['h1'])
以键值对的格式写会话:request.session['键'] = ‘值’
根据键读取值:request.session.get('键', 默认值)
清除所有会话,在存储中删除值部分:request.session.clear()
清除所有会话,在存储中删除会话的整条数据:request.session.flush()
删除会话中的指定键和值,在存储中只删除某个键及对应的值: del request.session['键']
设置会话的超时时间,如果没有指定过期时间则两个星期后过期:request.session.set_expiry(value)
		value=0,则关闭浏览器的时候就过期;value=None,则永不过期

19.代码优化方面怎么考虑?有什么想法?

答:

  1. 优化算法时间
    算法的时间复杂度对程序的执行效率影响最大,在python中可以通过选择合适的数据结构来优化时间复杂度,例如list和set查找某个元素的时间复杂度分别为O(n)和O(1),在不同场景由不同的优化方式。

  2. 循环优化
    每种编程语言都强调需要优化循环。在python中,可以使用大量的技巧使得循环运行的更快。
    尽量避免在循环中使用点操作,优化循环的关键就是减少python在循环内部执行的工作量。

  3. 函数选择
    在循环的时候使用xrange而不是range,使用xrange可以节省大量的系统内存,因为xrange()在序列中每次调用只产生一个整数元素,而range则会直接返回完整的元素列表,用于循环时会不必要的开销。在python3中xrange不再存在,里面range提供一个可以遍历任意长度的方位的iterator

  4. 并行编程
    因为GIL的存在,python很难充分利用多核CPU的优势,但是可以通过内置模块multiprocessing来实现一下集中并行模式:
    多进程:对于CPU密集型的程序,可以使用multiprocessing中的Process,Pool等封装好的类,通过多进程的方式实现并行计算,。但是因为进程中通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有大的提高。
    多线程:对于IO密集的程序,multiprocessing.dummy模块使用multiprocessing的接口封装threading,使得多线程编程也变得非常轻松
    分布式:multiprocessing中的Managers类提供了可以在不同进程之间共享数据的方式,可以子啊此基础上开发分布式的程序。

  5. 使用性能分析工具
    除了在ipython使用到的timeit模块,还有cProfile。cProfile的使用方法:python -m cProfile [文件名],可以在标准输出中看到每一个函数被滴哦用的次数及运行的时间,从而找到程序的性能瓶颈,可以有针对性的优化。

  6. set的用法
    set 的 union,intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的问题可以转换为 set 来操作。

  7. PyPy
    PyPy 是用 RPython(CPython 的子集)实现的 Python,根据官网的基准测试数据,它比 CPython 实现的 Python 要快 6 倍以上。快的原因是使用了 Just-in-Time(JIT)编译器,即动态编译器,与静态编译器(如 gcc,javac 等)不同,它是利用程序运行的过程的数据进行优化。由于历史原因,目前 pypy 中还保留着 GIL,不过正在进行的 STM 项目试图将 PyPy 变成没有 GIL 的 Python。如果 python 程序中含有 C 扩展(非 cffi 的方式),JIT 的优化效果会大打折扣,甚至比 CPython 慢(比 Numpy)。所以在 PyPy 中最好用纯 Python 或使用 cffi 扩展。

20.celery分布式任务队列

答: 情景:用户发起request,并等待response返回,在一些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发邮件、手机验证码等
使用 celery 后,情况就不一样了。解决:将耗时的程序放到 celery 中执行。
将多个耗时的任务添加到队列 queue 中,也就是用 redis 实现 broker 中间人,然后用多个 worker 去监听队列里的任务去执行。
任务 task:就是一个 Python 函数。
队列 queue:将需要执行的任务加入到队列中。
工人 worker:在一个新进程中,负责执行队列中的任务。
代理人 broker:负责调度,在布置环境中使用 redis。

21.Jieba分词

答: Jieba分词支持三种分词模式:
精确模式:试图将句子最精确的切开,适合文本分析
全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词功能
分词,添加自定义词典,关键词提取,词性标注,并行分词,Tokenize:返回词语在原文的起始位置,ChineseAnalyzer for Whoosh 搜索引擎。

22.简述Django下的(内建的)缓存机制

答: 一个动态网站的基本权衡点就是,它是动态的。每次用户请求页面,服务器就会重新计算,从开销处理的角度来看,这比读取一个线程的标准文件的代价要昂贵的多。
这就是需要缓存的地方。
Django自带了一个健壮的额缓存系统来保存动态页面,这样避免对于每次请求的重新计算。Django提供了不同级别的缓存力度:可以缓存特定视图的输出、可以仅仅缓存哪些很难生产出来的部分、或者可以缓存整个网站。Django也能很好的额配合“下游”缓存,比如Squid和基于浏览器的缓存。
设置缓存:
缓存系统需要一些设置才能使用。 也就是说,你必须告诉他你要把数据缓存在哪里- 是数据库中, 文件系统或者直接在内存中。它会影响你的缓存性能
你的缓存配置是通过 setting 文件的 CACHES 配置来实现的。这里有 CACHES 所有可配置的变量值。

23.Django中HTTP请求的处理流程(请求的生命周期)

答:

  • 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端。请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中
  • url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配,一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了。
  • 视图函数根据客户端的请求查询相应的数据.返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端
  • 客户端浏览器接收到返回的数据,经过渲染后显示给用户

24.django 中当一个用户登录 A 应用服务器(进入登录状态),然后下次请求被 nginx代理到 B 应用服务器会出现什么影响?

答: 如果用户在 A 应用服务器登陆的 session 数据没有共享到 B 应用服务器,那么之前的登录状态就没有了。

25.Django重定向是怎么实现的?用的什么状态码?

答: 使用HttpResponseRedirect,redirect和reverse
状态码:302, 301

26.Django 本身提供了 runserver,为什么不能用来部署

runserver 方法是调试 Django 时经常用到的运行方式,它使用 Django 自带的 WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。

uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具有超快的性能、低内存占用和多 app 管理等优点,并且搭配着 Nginx 就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势, 提升性能。

27.电商网站库存问题

一般团购,秒杀,特价之类的活动,这样会使访问量激增,很多人抢购一个商品,作为活动商品, 库存肯定是很有限的。控制库存问题,数据库的事务功能是控制库存超卖的有效方式。
(1)在秒杀的情况下,肯定不能如此频率的去读写数据库,严重影响性能问题,必须使用缓存,将需要秒杀的商品放入缓存中,并使用锁来处理并发情况,先将商品数量增减(加锁、解析)后在进行其他方面的处理,处理失败再将数据递增(加锁、解析),否则表示交易成功。
(2)这个肯定不能直接操作数据库的,会挂的。直接读库写库对数据库压力太大了,要用到缓存。
(3)首先,多用户并发修改同一条记录时,肯定是后提交的用户将覆盖掉前者提交的结果了。这个直接可以使用加乐观锁的机制去解决高并发的问题。

28.什么是反向解析

使用场景:模板中的超链接,视图中的重定向
使用:在定义 url 时为 include 定义 namespace 属性,为 url 定义 name 属性在模板中使用 url 标签:{% url ‘namespace_value:name_value’%}
在视图中使用 reverse 函数:redirect(reverse('namespce_value:name_value’))根据正则表达式动态生成地址,减轻后期维护成本。
注意反向解析传参数,主要是在我们的反向解析的规则后面天界了两个参数,两个参数之间使用空格隔开:位置参数

29.Django 日志管理

配置好之后:

import logging
logger=logging.getLogger( name )        # 为 loggers 中定义的名称
logger.info("some info ...)

可用函数有:
logger.debug()
logger.info()
logger.warning()
 logger.error()

30.列举django的内置组件?

答:

  • admin:是对model中对应的数据表进行增删改查提供的组件
  • model组件:负责操作数据库
  • form组件:生成HTML代码;对数据有效性校验;校验信息返回并展示
  • ModelForm组件:用于数据库操作,也可以用于用户请求的验证

31.select_related和prefetch_related的区别?

答: 前提:有外键存在时,可以很好的减少数据库请求的次数,提高性能
select_related通过多表join关联查询,一次性活得所有数据,只执行一次SQL查询
prefetch_related分别查询每个表,然后根据他们之间的关系进行处理,执行两次查询

32.django ORM中三种能写SQL语句的方法

# 1.使用execute执行自定义的SQL
from django.db import connection
cursor = connection.cursor()
cursor.excute('SQL语句')

# 2.使用extra方法
queryset.extra(select={'key': 'SQL语句'})

# 3. 使用raw方法:执行原始SQL并返回模型;依赖model多用于查询

33.如何使用Django ORM批量创建数据库?

objs = [models.Book(title='图书{}'.format(i+15)) for i in range(100)]
models.Book.objects.bulk_create(objs)

34.django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新

答:

  1. 重写构造函数
def __init__(self, *args, **kwargs):
	super().__init__(*args, **kwargs)
	self.fiels['city'].weight.choices = models.City.objects.all().values_list('id', 'name')
  1. 利用ModelChoiceField字段,参数为queryset对象
authors = form_model.ModelMultipleChoiceField(queryset=models.NewType.objects.all())

35.django的Model中的ForeignKey字段中的on_delete参数有什么作用?

答: 删除关联表中的数据时,当前表与其关联的field的操作

on_delete=models.CASCADE			# 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING		# 删除关联数据,什么也不做
on_delete=models.PROTECT			# 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL			# 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT		# 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET						# 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

36.Django中间件与装饰器的区别

答:
Django的中间件是一个轻量级、底层的插件系统,可以接入django的请求和响应过程中,修改django的输入和输出。中间件的设计是为开发者提供了一种无侵入式的开发方式,增强了django框架的健壮性。
装饰器:主要是作用域问题。如果给视图函数上面添加装饰器,它能够保证这个视图的方法在执行之前或执行之后被执行。但是它仅仅适用于哪些视图添加装饰器,那些视图会有这些作用。
中间件:不会区分是哪个视图,所有的视图统统一视同仁,都会执行之前进行处理或请求之后进行处理。

你可能感兴趣的:(面经)