qidao123.com技术社区-IT企服评测·应用市场
标题:
Django 从项目明白 MTV架构
[打印本页]
作者:
锦通
时间:
2025-5-3 08:22
标题:
Django 从项目明白 MTV架构
一:项目快速入门
1. 环境准备与项目创建
# 创建虚拟环境
python -m venv myenv
source myenv/bin/activate # Linux/Mac
myenv\Scripts\activate.bat # Windows
# 安装依赖
pip install django==4.2.5 django-ckeditor
# 初始化项目
django-admin startproject book_manager
cd book_manager
复制代码
2. 项目布局解析
book_manager/
├── book_manager/
│ ├── __init__.py
│ ├── settings.py # 全局配置
│ ├── urls.py # 主路由
│ └── wsgi.py # 生产入口
├── books/ # 应用目录
│ ├── migrations/ # 数据库迁移
│ ├── templates/ # 模板文件
│ ├── __init__.py
│ ├── admin.py # 管理后台
│ ├── apps.py # 应用配置
│ ├── models.py # 数据模型
│ ├── tests.py # 单元测试
│ └── views.py # 视图逻辑
└── manage.py # 管理脚本
复制代码
二、MTV核心组件实践
1. Model层 - 数据引擎
# books/models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
bio = models.TextField()
def published_books(self):
return self.books.filter(is_published=True)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
content = models.TextField()
is_published = models.BooleanField(default=False)
publish_date = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-publish_date']
indexes = [models.Index(fields=['is_published'])]
def __str__(self):
return f"{self.title} - {self.author.name}"
复制代码
迁移利用:
python manage.py makemigrations
python manage.py migrate
复制代码
2. View层 - 业务指挥官
# books/views.py
from django.views.generic import ListView, DetailView
from .models import Book
class BookListView(ListView):
model = Book
template_name = 'books/list.html'
context_object_name = 'book_list'
paginate_by = 10
def get_queryset(self):
return super().get_queryset().filter(is_published=True).select_related('author')
class BookDetailView(DetailView):
model = Book
template_name = 'books/detail.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['related_books'] = self.object.author.books.exclude(pk=self.object.pk)[:3]
return context
复制代码
3. Template层 - 展示管家
<!-- books/templates/books/list.html -->
{% extends "base.html" %}
{% block content %}
<section class="book-listing">
<h2>最新上架书籍</h2>
<div class="grid">
{% for book in book_list %}
<article class="card">
<header>
<h3>{{ book.title }}</h3>
<p class="author">作者:{{ book.author.name }}</p>
</header>
<div class="content">
{{ book.content|truncatechars:150 }}
</div>
<footer>
<a href="{% url 'book_detail' book.pk %}" class="button">查看详情</a>
</footer>
</article>
{% empty %}
<p class="empty">暂无书籍信息</p>
{% endfor %}
</div>
{% include "includes/pagination.html" %}
</section>
{% endblock %}
复制代码
三、MTV全流程解析
1. 请求生命周期流程图
2. 三大组件协作关系
组件职责对应文件核心扩展点Model界说数据布局与业务规则models.py自界说Manager/QuerySetView处理业务逻辑与流程控制views.pyClass-based Views/MixinsTemplate数据可视化与用户交互templates/*.html自界说Template Tags
四、高级开发本领
1. 管理后台
# books/admin.py
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publish_status')
list_editable = ('is_published',)
raw_id_fields = ('author',)
@admin.display(description="发布状态")
def publish_status(self, obj):
return "已发布" if obj.is_published else "待审核"
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
search_fields = ('name',)
list_display = ('name', 'book_count')
@admin.display(description="著作数量")
def book_count(self, obj):
return obj.books.count()
复制代码
2. 性能优化计谋
查询优化
:
# 使用select_related减少查询次数
Book.objects.select_related('author').filter(is_published=True)
# 使用prefetch_related优化多对多关系
Author.objects.prefetch_related('books').all()
复制代码
缓存优化
:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def book_list(request):
# ...
复制代码
3. 架构扩展方案
中心件应用
:
# book_manager/middleware.py
class PerformanceMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start_time = time.time()
response = self.get_response(request)
duration = time.time() - start_time
print(f"请求处理耗时: {duration:.2f}s")
return response
复制代码
五、最佳实践总结
MTV开发黄金法则
模型驱动开发
:先设计数据模型再编写业务逻辑
视图保持精简
:复杂逻辑移交给模型或工具模块
模板职责单一
:制止在模板中编写业务逻辑
组件复用优先
:通过Mixin、Include等方式减少重复
常见题目解决方案
题目征象排查方向解决方案页面加载痴钝数据库查询优化使用select_related/prefetch_related管理后台利用卡顿列表页性能添加数据库索引/分页显示模板渲染异常上下文变量检查使用{% debug %}标签表单提交失败CSRF验证与表单校验检查表单界说与中心件设置
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4