Django 从项目明白 MTV架构

打印 上一主题 下一主题

主题 1673|帖子 1673|积分 5019

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一:项目快速入门

1. 环境准备与项目创建

  1. # 创建虚拟环境
  2. python -m venv myenv
  3. source myenv/bin/activate  # Linux/Mac
  4. myenv\Scripts\activate.bat  # Windows
  5. # 安装依赖
  6. pip install django==4.2.5 django-ckeditor
  7. # 初始化项目
  8. django-admin startproject book_manager
  9. cd book_manager
复制代码
2. 项目布局解析

  1. book_manager/
  2. ├── book_manager/
  3. │   ├── __init__.py
  4. │   ├── settings.py    # 全局配置
  5. │   ├── urls.py        # 主路由
  6. │   └── wsgi.py        # 生产入口
  7. ├── books/             # 应用目录
  8. │   ├── migrations/    # 数据库迁移
  9. │   ├── templates/     # 模板文件
  10. │   ├── __init__.py
  11. │   ├── admin.py       # 管理后台
  12. │   ├── apps.py        # 应用配置
  13. │   ├── models.py      # 数据模型
  14. │   ├── tests.py       # 单元测试
  15. │   └── views.py       # 视图逻辑
  16. └── manage.py          # 管理脚本
复制代码
二、MTV核心组件实践

1. Model层 - 数据引擎

  1. # books/models.py
  2. from django.db import models
  3. class Author(models.Model):
  4.     name = models.CharField(max_length=100)
  5.     bio = models.TextField()
  6.    
  7.     def published_books(self):
  8.         return self.books.filter(is_published=True)
  9. class Book(models.Model):
  10.     title = models.CharField(max_length=200)
  11.     author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
  12.     content = models.TextField()
  13.     is_published = models.BooleanField(default=False)
  14.     publish_date = models.DateTimeField(auto_now_add=True)
  15.     class Meta:
  16.         ordering = ['-publish_date']
  17.         indexes = [models.Index(fields=['is_published'])]
  18.     def __str__(self):
  19.         return f"{self.title} - {self.author.name}"
复制代码
迁移利用:
  1. python manage.py makemigrations
  2. python manage.py migrate
复制代码
2. View层 - 业务指挥官

  1. # books/views.py
  2. from django.views.generic import ListView, DetailView
  3. from .models import Book
  4. class BookListView(ListView):
  5.     model = Book
  6.     template_name = 'books/list.html'
  7.     context_object_name = 'book_list'
  8.     paginate_by = 10
  9.     def get_queryset(self):
  10.         return super().get_queryset().filter(is_published=True).select_related('author')
  11. class BookDetailView(DetailView):
  12.     model = Book
  13.     template_name = 'books/detail.html'
  14.    
  15.     def get_context_data(self, ​**kwargs):
  16.         context = super().get_context_data(**kwargs)
  17.         context['related_books'] = self.object.author.books.exclude(pk=self.object.pk)[:3]
  18.         return context
复制代码
3. Template层 - 展示管家

  1. <!-- books/templates/books/list.html -->
  2. {% extends "base.html" %}
  3. {% block content %}
  4. <section class="book-listing">
  5.   <h2>最新上架书籍</h2>
  6.   <div class="grid">
  7.     {% for book in book_list %}
  8.     <article class="card">
  9.       <header>
  10.         <h3>{{ book.title }}</h3>
  11.         <p class="author">作者:{{ book.author.name }}</p>
  12.       </header>
  13.       <div class="content">
  14.         {{ book.content|truncatechars:150 }}
  15.       </div>
  16.       <footer>
  17.         <a href="{% url 'book_detail' book.pk %}" class="button">查看详情</a>
  18.       </footer>
  19.     </article>
  20.     {% empty %}
  21.     <p class="empty">暂无书籍信息</p>
  22.     {% endfor %}
  23.   </div>
  24.   {% include "includes/pagination.html" %}
  25. </section>
  26. {% endblock %}
复制代码
三、MTV全流程解析

1. 请求生命周期流程图

     2. 三大组件协作关系

组件职责对应文件核心扩展点Model界说数据布局与业务规则models.py自界说Manager/QuerySetView处理业务逻辑与流程控制views.pyClass-based Views/MixinsTemplate数据可视化与用户交互templates/*.html自界说Template Tags 四、高级开发本领

1. 管理后台

  1. # books/admin.py
  2. @admin.register(Book)
  3. class BookAdmin(admin.ModelAdmin):
  4.     list_display = ('title', 'author', 'publish_status')
  5.     list_editable = ('is_published',)
  6.     raw_id_fields = ('author',)
  7.    
  8.     @admin.display(description="发布状态")
  9.     def publish_status(self, obj):
  10.         return "已发布" if obj.is_published else "待审核"
  11. @admin.register(Author)
  12. class AuthorAdmin(admin.ModelAdmin):
  13.     search_fields = ('name',)
  14.     list_display = ('name', 'book_count')
  15.    
  16.     @admin.display(description="著作数量")
  17.     def book_count(self, obj):
  18.         return obj.books.count()
复制代码
2. 性能优化计谋



  • 查询优化
    1. # 使用select_related减少查询次数
    2. Book.objects.select_related('author').filter(is_published=True)
    3. # 使用prefetch_related优化多对多关系
    4. Author.objects.prefetch_related('books').all()
    复制代码
  • 缓存优化
    1. from django.views.decorators.cache import cache_page
    2. @cache_page(60 * 15)
    3. def book_list(request):
    4.     # ...
    复制代码
3. 架构扩展方案



  • 中心件应用
  1. # book_manager/middleware.py
  2. class PerformanceMiddleware:
  3.     def __init__(self, get_response):
  4.         self.get_response = get_response
  5.         
  6.     def __call__(self, request):
  7.         start_time = time.time()
  8.         response = self.get_response(request)
  9.         duration = time.time() - start_time
  10.         print(f"请求处理耗时: {duration:.2f}s")
  11.         return response
复制代码
五、最佳实践总结



  • MTV开发黄金法则

    • 模型驱动开发:先设计数据模型再编写业务逻辑
    • ​视图保持精简:复杂逻辑移交给模型或工具模块
    • ​模板职责单一:制止在模板中编写业务逻辑
    • ​组件复用优先:通过Mixin、Include等方式减少重复

  • 常见题目解决方案
题目征象排查方向解决方案页面加载痴钝数据库查询优化使用select_related/prefetch_related管理后台利用卡顿列表页性能添加数据库索引/分页显示模板渲染异常上下文变量检查使用{% debug %}标签表单提交失败CSRF验证与表单校验检查表单界说与中心件设置
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表