Django框架(十一、ORM补充)

本文介绍了Django框架中ORM的高级使用技巧,包括select_related提高查询效率,order_by和reverse进行排序操作,defer与only进行字段选择,以及using指定数据库连接。通过这些方法,可以更好地管理和优化数据库查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select_related(self, *fields)

def select_related(self, *fields)
     性能相关:表之间进行join连表操作,一次性获取关联的数据。
     model.tb.objects.all().select_related()
     model.tb.objects.all().select_related('外键字段')
     model.tb.objects.all().select_related('外键字段__外键字段')
    

################################################################
"""
    从sql语言中来分析select_related():
    	model.tb.objects.all()的sql语言就是 select * from tb
    	model.tb.objects.all().select_related('外键字段')的事情了语言是select * from tb left join 外键表 on tb.外键字段_id = 外键表.id
	该方法能够减少获取外键连表的请求数据库次数,能够提高程序的执行效率。
"""

order_by() 和 reverse()方法

def order_by(self, *field_names)
    # 用于排序
    models.UserInfo.objects.all().order_by('-id','age')

 def reverse(self):
    # 倒序
    models.UserInfo.objects.all().order_by('-nid').reverse()
    # 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序


    # order_by("-字段")和order_by().reverse()两种方法都是倒序,需要注意的是,reverse()一定要在order_by()方法下才能使用

defer() 和 only()方法

 def only(self, *fields):
    #仅取某个表中的数据
     models.UserInfo.objects.only('username','id')
     或
     models.UserInfo.objects.filter(...).only('username','id')
 
def defer(self, *fields):
    models.UserInfo.objects.defer('username','id')
    或
    models.UserInfo.objects.filter(...).defer('username','id')
    #映射中排除某列数据
    
def values(self, *fields):
    # 获取每行数据为字典格式
    models.UserInfo.objects.all().values('username','id')

def values_list(self, *fields, **kwargs):
	models.UserInfo.objects.all().values_list('username','id')
    # 获取每行数据为元祖

"""
   only拿到的数据是一个对象,并且是只包含“id,和user”的对象:[obj(id),obj(user)]
   defer拿到的数据也是一个对象,映射中排除了指定的某列数据
   
    需要注意的是,未拿到的数据也可以通过  obj.字段  的方式获取值,不过该方式会重新再发一次请求,影响效率
   value拿到的是一个字典,
   value_list拿到的是一个元组
   
"""

using()方法

 def using(self, alias):
    models.Person.objects.all().using(alias="default")
    #指定使用的数据库,参数为别名(setting中的设置)
<think>好的,用户之前问过关于微信小程序、Python后端和MySQL的组合开发方案,现在他们想了解Django框架。我需要先回顾之前的对话,确保这次回答与之前的建议一致,并且补充Django特有的内容。 首先,用户可能已经知道Python的后端框架有Flask和Django,之前提到过,所以需要对比Django和Flask,强调Django的优势,比如全功能、适合复杂项目。用户可能正在选择框架,需要详细说明Django的特点,帮助他们做决定。 接下来,用户可能需要知道Django的核心组件,比如ORM、Admin、路由等,这些是Django的亮点,应该详细解释。同时,要结合之前的MySQL部分,说明Django如何与MySQL配合,使用ORM的好处,比如避免直接写SQL,提升开发效率。 然后,用户可能需要具体的步骤,比如如何创建项目、配置数据库、开发接口。需要给出代码示例,尤其是与之前Flask示例的对比,突出Django的结构更严谨,比如MTV模式。同时,强调Django的安全性和内置功能,如中间件、用户认证,这些对用户来说可能很重要,尤其是处理微信小程序的后端时需要考虑的安全性。 另,用户之前提到了微信小程序的前端通信,这里需要补充Django如何提供RESTful API,可能需要提到DRF(Django REST Framework),因为这是Django常用的工具,适合构建API,和之前的Flask示例对应起来,让用户明白转换到Django后的实现方式。 还要考虑用户的实际应用场景,比如电商或社交应用,给出典型模块的实现步骤,比如用户模块,用Django的User模型,或者自定义用户模型,结合MySQL的表结构设计。订单模块可能需要使用DjangoORM来创建模型,并展示如何通过视图处理业务逻辑。 优势与挑战部分需要对比之前的回答,指出Django在开发效率、安全性、扩展性方面的优势,同时提到学习曲线和高并发处理的挑战,可能用户的项目规模会影响框架选择,需要给出建议场景,帮助用户判断是否适合使用Django。 最后,要确保回答结构清晰,按照技术架构、实现步骤、关点的逻辑展开,保持与之前回答一致的格式,方便用户对比参考。可能用户希望快速上手,所以提供安装命令和代码片段,以及项目结构示例,能帮助他们更快开始实际开发。</think>我们将从框架特性、核心组件、开发流程和最佳实践四个维度,系统解析Django框架的技术体系: $$Django架构图$$ $$[客户端] \rightarrow [WSGI接口] \rightarrow [URL路由] \rightarrow [视图层] \leftrightarrow [模型层] \rightarrow [MySQL数据库]$$ $$\updownarrow$$ $$[模板引擎] \quad [中间件] \quad [Admin后台]$$ 一、框架核心特性 1. **MTV模式**(Model-Template-View) - 模型层:$ORM$对象关系映射 - 模板层:$DTL$模板引擎 - 视图层:业务逻辑处理器 2. **开箱即用功能** ```python # 内置模块示例 django.contrib.admin # 管理后台 django.contrib.auth # 认证系统 django.contrib.sessions # 会话管理 ``` 3. **安全机制** - CSRF防护:`{% csrf_token %}` - XSS过滤:自动转义HTML - SQL注入防护:ORM参数化查询 二、核心组件解析 1. **ORM系统** ```python class User(models.Model): username = models.CharField(max_length=50) created_at = models.DateTimeField(auto_now_add=True) # 生成SQL: CREATE TABLE `user` (...) ``` 2. **路由配置** ```python # urls.py path('api/articles/<int:year>/', views.article_archive) ``` 3. **中间件机制** ```python class CustomMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 预处理逻辑 response = self.get_response(request) # 后处理逻辑 return response ``` 三、开发实践指南 1. **项目创建** ```bash django-admin startproject mysite python manage.py startapp blog ``` 2. **数据库配置** ```python # settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'root', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '3306', } } ``` 3. **REST API开发** ```python # 使用DRF框架示例 from rest_framework import serializers, viewsets class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = '__all__' class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer ``` 四、典型应用场景 1. **CMS系统开发** - 利用Admin后台快速搭建 - 使用富文本编辑器插件 - 多级分类管理 2. **电商平台** ```python # 订单模型示例 class Order(models.Model): STATUS_CHOICES = [ (0, '待支付'), (1, '已发货'), (2, '已完成') ] user = models.ForeignKey(User, on_delete=models.CASCADE) total = models.DecimalField(max_digits=10, decimal_places=2) status = models.SmallIntegerField(choices=STATUS_CHOICES) ``` 3. **数据分析后台** - 整合Pandas进行数据处理 - 使用Matplotlib生成可视化图表 - 定时任务(Celery + Redis) 五、优势与挑战 **核心优势:** - 开发效率高:`$scaffolding$`脚手架功能 - 安全性强:内置20+安全防护机制 - 扩展性好:`$中间件$`+`$信号机制$` - 生态完善:超过5000个第三方包 **主要挑战:** - 学习曲线:需掌握`$MVT$`设计模式 - 性能优化:N+1查询问题需注意 - 灵活性:相比微框架结构更严格 六、最佳实践建议 1. **项目结构规范** ``` mysite/ ├── apps/ # 自定义应用 ├── static/ # 静态文件 ├── templates/ # 全局模板 ├── utils/ # 工具类 └── settings/ ├── base.py # 基础配置 ├── dev.py # 开发环境 └── prod.py # 生产环境 ``` 2. **性能优化方案** - 使用`select_related`和`prefetch_related`优化查询 - 启用数据库连接池 - 配置缓存机制:`$redis$`+`$memcached$` 3. **部署方案** ```bash # 生产环境部署流程 python manage.py collectstatic gunicorn --workers 4 mysite.wsgi:application nginx反向代理 → 负载均衡 → 数据库主从复制 ``` 实际开发中建议: 1. 使用`python-decouple`管理环境变量 2. 通过`django-debug-toolbar`进行性能分析 3. 遵循`PEP8`编码规范 4. 重要业务逻辑编写单元测试: ```python class OrderTestCase(TestCase): def test_order_creation(self): user = User.objects.create(username='test') order = Order.objects.create(user=user, total=100) self.assertEqual(order.status, 0) ``` 对于微信小程序+Django+MySQL的方案,可参考以下数据流: $$小程序端 \xrightarrow{HTTPS} Django REST API \xrightarrow{ORM} MySQL$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值