Python后端日常操作之在Django中「强行」使用MVVM设计模式

2020-07-08 00:00:00 数据 代码 分页 距离 序列化

扫盲

首先带大家了解一下什么是MVVM模式:

什么是MVVM?MVVM是Model-View-ViewModel的缩写。
MVVM是MVC的增强版,实质上和MVC没有本质区别,只是代码的位置变动而已。
从名字上看,MVVM比MVC架构中多了一个ViewModel,没错,就是这个ViewModel,他是MVVM相对于MVC改进的核心思想。在开发过程中,由于需求的变更或添加,项目的复杂度越来越高,代码量越来越大,此时我们会发现MVC维护起来有些吃力,首先被人吐槽的多的就是MVC的简写变成了Massive-View-Controller(意为沉重的Controller) 由于Controller主要用来处理各种逻辑和数据转化,复杂业务逻辑界面的Controller非常庞大,维护困难,所以有人想到把Controller的数据和逻辑处理部分从中抽离出来,用一个专门的对象去管理,这个对象就是ViewModel,是Model和Controller之间的一座桥梁。当人们去尝试这种方式时,发现Controller中的代码变得非常少,变得易于测试和维护,只需要Controller和ViewModel做数据绑定即可,这也就催生了MVVM的热潮。

引言

大家都知道Django是MVT模式,Model就是View和Template/Interface之间的数据传递的「信使」,这种模式存在一个问题,就是当我们的业务不断扩大之后需要在接口返回出model里不包含的数据时该怎么办?例如一个商店,我们要动态计算它距离我们当前位置有多远,那么这个距离肯定是不包含在Model里面的,数据库也不可能实时存储这类数据。

那么这时候我们就需要在Model上,再加上一层ViewModel,顾名思义,视图模型,是用来在视图里传递和处理数据的模型。

简单实现

在App包下面创建一个view_models文件,内容如下:

from rest_framework.request import Request
from core.models import Store
from core.serializers import StoreSerializer

class StoreViewModel:
    def __init__(self, store: Store, distance=0.0, request: Request = None):
        self.store = store
        self.distance = distance
        self.request = request

    @property
    def serialize_data(self):
        return StoreSerializer(self.store, context={
            'distance': self.distance,
            'request': self.request,
        }).data

相关文章