Django中数据库查询应写在Model还是View?新手技术疑问
你的写法没问题,但更推荐把查询逻辑封装到Model中
你当前的代码是可以正常运行的,但从Django的最佳实践角度来说,把数据库查询逻辑放在View里并不是最理想的做法——Django遵循MTV模式(Model-Template-View),对应传统MVC里的Model-View-Controller,这里的View其实承担了控制器的角色,而最佳实践是让Model层承担数据相关的所有逻辑(包括查询、业务规则),也就是所谓的「胖模型,瘦视图」,这样代码的复用性、可维护性都会更好。
下面提供两种在Model中封装查询的常用方法:
方法一:使用Model类方法
直接在Moves类内定义类方法,把查询逻辑封装进去:
# models.py from django.db import models class Moves(models.Model): name = models.CharField(max_length=64) description = models.CharField(max_length=500) position_id = models.IntegerField() is_offence = models.BooleanField(default=True) @classmethod def get_half_guard_moves(cls): return cls.objects.values().filter(position_id=2)
然后在View中直接调用该方法:
# views.py def half_guard_moves(request): half_guard_moves = Moves.get_half_guard_moves() return render(request, "moves/halfguardmoves.html", {'half_guard_moves': half_guard_moves})
方法二:自定义Manager(官方推荐)
Django的Model默认使用objects作为数据管理器,你可以自定义管理器来封装常用查询,这是Django官方更推荐的方式:
# models.py from django.db import models class MoveManager(models.Manager): def get_half_guard_moves(self): return self.values().filter(position_id=2) class Moves(models.Model): name = models.CharField(max_length=64) description = models.CharField(max_length=500) position_id = models.IntegerField() is_offence = models.BooleanField(default=True) objects = MoveManager() # 替换默认管理器
View中的调用方式简洁直观:
# views.py def half_guard_moves(request): half_guard_moves = Moves.objects.get_half_guard_moves() return render(request, "moves/halfguardmoves.html", {'half_guard_moves': half_guard_moves})
为什么要这么做?
把查询逻辑放在Model层的核心优势:
- 复用性:如果其他View也需要获取half guard招式数据,直接调用封装好的方法即可,无需重复编写查询语句
- 可维护性:后续修改查询条件(比如调整
position_id值、增加过滤规则)时,只需修改Model内的代码,不用改动多个View - 职责清晰:View层专注处理请求和响应渲染,数据逻辑全部收拢在Model层,代码结构更清晰
内容的提问来源于stack exchange,提问作者Dylano236
相关产品推荐
相关产品推荐

