跳到主要内容

Django 核心

问题

Django 的 MTV 架构是什么?ORM、中间件、信号、Admin 怎么用?

答案

MTV 架构

组件对应 MVC职责
ModelModel数据模型,ORM 映射
TemplateViewHTML 模板渲染
ViewController业务逻辑,处理请求返回响应

Django ORM

from django.db import models

class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey("User", on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)

class Meta:
ordering = ["-created_at"]

# QuerySet 链式调用(惰性求值)
articles = (
Article.objects
.filter(author__name="Alice")
.exclude(title__contains="draft")
.select_related("author") # JOIN 减少查询
.prefetch_related("tags") # 预取多对多
.order_by("-created_at")[:10]
)

中间件

class TimingMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
import time
start = time.time()
response = self.get_response(request)
duration = time.time() - start
response["X-Response-Time"] = f"{duration:.4f}s"
return response

信号

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)

常见面试问题

Q1: Django ORM 的 N+1 查询问题?

答案

N+1 问题:查询列表时每条记录额外查询关联表。解决方案:

  • select_related("fk_field"):外键/一对一,用 JOIN
  • prefetch_related("m2m_field"):多对多/反向外键,额外一条 SQL

Q2: Django 中间件的执行顺序?

答案

请求阶段从上到下执行,响应阶段从下到上执行(类似洋葱模型)。

相关链接