[ Django面试题[1] ]


  1. django, flask, tornado的比较
django框架设计为全栈的web框架,功能齐全, orm, 中间件, 模板语言,表单, 而且生态丰富有类型drf等.., 但是学习成本高
flask框架轻量级, 只有默认的wsgi依赖,与jinja2模板语言依赖, 学习成本低
tornado是异步框架, 非常适合高并发的场景下使用
  1. 什么是wsgi
是python的网络服务网关接口, 规定了web与python语言之间的通信
  1. django的生命周期

  2. django的内置组件

Admin site生成了强大的后台管理系统, 可以方便的管理数据库中的数据
ORM: 方便的操作数据库
模板引擎:前后端不分离开发,由后端渲染生成html
表单组件:快捷生成自定义表单。
缓存: 使用cache方便的进行数据缓存。
国际化和本地化: 提供了国际化的支持, 能实现多语言网站
  1. django中间件的5个方法, 以及django中间件的应用场景
Django中间件是一种可插拔的组件,可以在请求和响应处理过程中对它们进行修改或添加额外的功能。Django中间件的5个方法包括:
    process_request(request):在请求到达视图之前调用。
    process_view(request, view_func, view_args, view_kwargs):在请求到达视图之前调用,但在process_request()之后调用。
    process_template_response(request, response):在视图返回TemplateResponse对象时调用。
    process_response(request, response):在视图返回响应之后调用。
    process_exception(request, exception):在视图抛出异常时调用。
Django中间件的应用场景包括:
    认证和授权
    缓存
    日志记录
    跨域请求
    API版本控制
  1. FBV和CBV
FBV是基于函数的视图, flask推荐使用,简单灵活, 可读性, 重复代码多
CBV是类视图, 在django中推荐使用,学习成本高, 可读性好, 易于维护。
  1. django的request对象是什么时候创建的
在Django中,request对象是在每个请求到达Django应用程序时创建的。request对象包含了请求的元数据,如请求方式、请求头、请求参数等信息。在视图函数中,可以通过request对象获取这些信息并进行处理。
  1. django视图中使用装饰器
method_decorator装饰器
  1. Django orm中能写sql的三种方法
在Django ORM中,可以使用以下三种方法来执行原生SQL语句:
    使用raw()方法进行原生SQL查询并返回模型实例。
    完全避开模型层,直接执行自定义的SQL语句。
    使用cursor()方法获取游标并执行SQL语句。
  1. Django orm读写分离配置
在Django ORM中,可以使用第三方库来实现读写分离。其中,最常用的是django-db-balancer。这个库可以将读操作和写操作分别分配到不同的数据库上,从而实现读写分离。
  1. Django批量新增
bulk_create
  1. orm中 db first 和 code first的含义?
在Django ORM中,有两种常见的开发方式:Code First和Database First。Code First是指先定义数据模型,然后由ORM框架自动创建数据库表结构;而Database First则是先定义数据库表结构,然后由ORM框架自动生成数据模型。
在Django中,默认使用的是Code First方式,即根据定义的数据模型自动创建数据库表结构。但是,如果您已经有了一个现有的数据库,您可以使用Database First方式来生成数据模型。具体来说,您可以使用
inspectdb
命令来自动从现有数据库中生成数据模型。例如:
python manage.py inspectdb > models.py
这将从现有数据库中生成数据模型,并将其保存到名为models.py的文件中。
  1. django 中contenttype组件
在Django中,contenttypes是一个内置的应用程序,它可以追踪项目中所有app和model的对应关系,并记录在ContentType表中。 每当我们创建了新的model并执行数据迁移后,在数据库中会自动生成一个django_content_type表。
ContentType模型是contenttypes应用程序的核心,它具有两个字段,这两个字段共同描述了安装的模型:app_label和model。其中,app_label是指模型所属的应用程序名称,而model则是指模型名称。通过ContentType模型,我们可以轻松地获取任何模型的元数据信息,例如模型名称、应用程序名称等。
  1. orm 与原生sql的优劣
ORM和原生SQL都有各自的优缺点。ORM是一种抽象层,它可以将数据库操作封装在一个高级别的API中,从而使开发人员可以更轻松地进行数据库操作。ORM还可以提供更好的可移植性,因为它们通常是基于标准的SQL语法构建的。此外,ORM还可以提供更好的安全性,因为它们通常会自动处理SQL注入等安全问题。
然而,ORM也有一些缺点。首先,ORM可能会导致性能问题,因为它们通常需要执行多个查询才能完成一个操作。其次,ORM可能会导致开发人员无法使用数据库的所有功能,因为它们通常只支持数据库的子集。最后,ORM可能会导致代码复杂性增加,因为它们通常需要使用大量的配置和元数据来描述数据模型。
相比之下,原生SQL可以提供更好的性能和更多的灵活性。原生SQL还可以让开发人员使用数据库的所有功能,并且通常比ORM更容易调试和优化。但是,原生SQL也有一些缺点。首先,原生SQL可能会导致代码复杂性增加,因为它们通常需要手动处理连接、事务和其他细节。其次,原生SQL可能会导致安全问题,因为它们容易受到SQL注入等攻击。
  1. ORM的源码解析
在创建模型的时候
class Book(models.Model):
    class Meta:
        tb_table = 'tb_book'

在Model类中它选择了metaclass元类-> BaseModel
当程序运行的时候, 定义了metaclass元类的类, 会自动触发元类的call方法
例如:BaseModel中的call方法

1. attr_meta就是Meta类
2. 会循环判断attr中是否存在 FileField字段中有的contribute_to_class方法, 单独存到字典, 其他的分到普通字典
3. 创建新类super().new()
4. 判断Meta中是否有 abstract 抽象, 他会把此模型, 不执行迁移, 用作继承给其他模型用。
5. 判断attr_mata是否存在, 不存在从新类中getattr获取
6. 从新类中获取_meta这个属性复制给meta
7. 从meta里面判断是否有app_lable应用名
8. new_class.add_to_class('_meta', Options(meta, app_label))
8.1 调用Options对象的contribute_to_class方法
8.2 Option字段属性中会 对各种属性进行获取和定义
9. 设置其他属性
10. opts.managers一开始是空
10.1 如果opts.name == 'objects'则报错
11. 获取一个Manage()对象
11.1 class Manager(BaseManager.from_queryset(QuerySet))类
11.2 from_queryset通过type动态创建类, 相当于是继承了BaseManageer(),内部Basemanager._get_queryset_methods()方法
11.3 这些属性就是从QuerySet里面取出来的一大堆方法, filter, get, excute等等方法..放到了Manager类
12. 给新类赋值new_class.objects = manage属性
  1. onetonone , manytomany, foreign_key这三个的区别 一对一 多对多 一对多