Django的models的分层设计(避免循环引用)

在一个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文件中,那么,我们在开发的过程中可以减少很多烦恼。

分层设计的思想不只是避免了循环引用,同时也使得我们的项目结构更加清晰明了,有助于项目的开发。

发布了49 篇原创文章 · 获赞 10 · 访问量 9234

猜你喜欢

转载自blog.csdn.net/heibuliuqiu_gk/article/details/103464801