You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:41:38