Django2.2 学习笔记 (8)_模型设计中的分层思想

在一个Django项目中,通常都会有多个app,在每个app中都有一个models.py文件用来存放相应的模型类(模型类是数据库表的映射)。而在模型类与模型类之间很有可能会存在某种关联,比如外键关联,这时,相关联的模型类很有可能不在同一个models.py文件中,很有可能是跨越了app来关联的。这时,如果app1中的models.py文件引用了app2中的models.py文件来建立外键关联,而app2中的models.py文件也恰好引用了app1中的models.py文件来进行外键关联,这时就发生了循环引用,在Python中循环引用是会报错的。

如上图所示,假设在一个Django项目中两个app,分别是users(用户相关),goods(商品相关),在users的models.py文件中有两个用户相关的模型类,分别是Users(用户信息),UserOrders(用户的订单信息),在goods的models.py文件中有两个商品相关的模型类,分别是Goods(商品信息),GoodComments(商品的评论)。到这里,我们可以想到,UserOrders肯定会和Goods通过外键关联起来,而GoodComments也肯定会和Users通过外键关联起来,这样他们就进行了循环引用。

因此,我们将采取一种方法来解决这种循环引用的问题,就是标题提到的分层设计,分层我们指的是将app进行分层(即:models.py分层,因为models.py在app内部),下层不能引用上层,而上层可以引用下层,这样就可以保证不会发生循环引用了。

还是以上面那里例子来说明:

如图所示,我们在原来的两个app中只存放了各自的实体模型类:Goods和Users,因为这两个类肯定会被其他的类引用,而这两个类不会去引用其他的类,所以我们将这两个类所在的app放在了最下层,同时我们又创建了一个app:operations,我们将之前发生相互引用的模型类放在这个app里面,而这个app处于上层,可以去引用下层的模型类来制造关联。这样就避免了循环引用。

这只是一个简单说明封层设计的例子,实际开发中肯定要比这个复杂得多,可能会分成很多层,但是,只要我们在设计app时,加入分层设计思想,将项目结构建立好,而不是随意的将模型类放在一个app的models.py文件中,那么,我们在开发的过程中可以减少很多烦恼。

分层设计的思想不只是避免了循环引用,同时也使得我们的项目结构更加清晰明了,有助于项目的开发。
————————————————
版权声明:本文为CSDN博主「HBLQ_GK」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/heibuliuqiu_gk/article/details/103464801


一个示例:

将UserModel设计为最下层的模型

在模型中设计一个BaseModel类:增加一个数据添加时间

ps:因为这只是一个模型类,不需要创建相应的数据表,所以将Meta中的 abstract参数设置为  True

from datetime import datetime       # 导入date模块

from django.db import models
from django.contrib.auth.models import AbstractUser     # 导入Django自带的用户模块


class BaseModel(models.Model):
    add_time = models.DateTimeField(verbose_name="添加时间", default=datetime.now)
    class Meta:
        abstract = True     # 表示该模型将不会创建任何数据表。当其用作其它模型类的基类时,它的字段会自动添加至子类
发布了18 篇原创文章 · 获赞 0 · 访问量 575

猜你喜欢

转载自blog.csdn.net/zhsworld/article/details/103831948