关于网站Model的组织

2011-04-07 01:47:09 +08:00
 killall
用WEB.PY开发,MODEL层我是在Models文件夹下面创建一个模块test,test模块下面写了一个 class test 然后在逻辑层调用的时候必须要 from models.test import * 这样才能调用 test类下面的数据库操作方法,现在一个问题困扰着我是当一个页面调用多个表的数据的时候,我必须要
from models.test1 import *
from models.test2 import *
from models.test3 import *
from models.test4 import *
这样写才能调用相关的数据库操作方法,数据库多的话就要写好多次 from import 如果把CLASS都写入到一个文件里面以后,这个问题就可以解决,但是我怕如果以后数据表多了 CLASS多了,都堆在一个文件里面不好管理,求问各位有什么办法能更好的组织model吗?
5291 次点击
所在节点    Python
13 条回复
Livid
2011-04-07 11:59:20 +08:00
我目前的做法是用一个 package。

比如类似这样的结构:

v2ex/babel/data/models/__init__.py

用的时候:

from v2ex.babel.data.models import *
killall
2011-04-07 12:25:25 +08:00
@Livid 嗯,感谢Livid的回答,但是这样的做法貌似会出现当M多大时候的时候出现管理混乱的情况。
Livid
2011-04-07 12:28:45 +08:00
@killall 如果真到了那样的阶段,那么就在 models 下再拆包好了。比如:

from v2ex.babel.data.models.topic import *
from v2ex.babel.data.models.member import *
...
reorx
2011-04-07 13:04:02 +08:00
可以尝试吧数据库操作的方法直接写在相应的类里面,然后想调用哪个类的数据就直接import进来,执行相关方法。

比如(我用的是Django,不过应该大同小异):

class Book(Model):
author = ForeignKey(Author)
title = CharField(max_length=50)
....
@classmethod
def get_by_aid(cls, aid):
# aid means author_id
try:
d = cls.objects.filter(author__id=aid)
except:
d = None
return d

用的时候直接from models import Book;books = Book.get_by_aid(aid);就可以了。
Livid
2011-04-07 13:08:00 +08:00
@reorx 请教一个初级问题:

@classmethod 这样的语法是从 Python 的哪个版本开始支持的呢?
vayn
2011-04-07 13:21:24 +08:00
@Livid 我在 SudoRobot 里用了 @classmethod 这个装饰符,虽然忘记了是什么时候引入的但至少在 Python 2.5 可以用。
qichangxing
2011-04-07 13:47:17 +08:00
from models.test1 import *
这种做法容易造成名字污染,比如不同 model 下面有相同的对象时就不易排查错误。

采用下面的做法更清晰:
from models import test1
使用时 test1.a,test1.b 等
qichangxing
2011-04-07 13:49:46 +08:00
另外,对多东西太多,可以按目录(包)来组织,比如:
models/
models/__init__.py # 空文件,必须,表示当前是一个可引用的包
models/people.py
models/product.py
models/category.py
killall
2011-04-07 14:00:05 +08:00
@reorx 如果这样组织可以不用classmethod的修饰符就可以完成
@qichangxing 嗯,目前是按照这样的方式组织,但是我想做的是 只要一句from..import 就可以使用所有的MODEL,所以现在看来用@livid的这种组织方式在实际应用中是否可行
reorx
2011-04-07 14:37:31 +08:00
@Livid 据《Learning Python》里的讲解,在2.2里已经可以调用内置函数staticmethod和classmethod来编写静态方法和类方法。而有关装饰器的使用,虽然没有特别指明从哪个版本开始出现,但根据前言里“反映2.5的所有变化”以及对装饰器并不详细的描述来看,应该就是2.5的。有空再去网上考证一下。

@killall 是的,不过用装饰器相当于注释,会使代码更清晰易读一些~
vayn
2011-04-07 14:43:38 +08:00
reorx
2011-04-07 14:43:53 +08:00
@qichangxing 之前我也是这样用的,后来由于导入过于复杂的缘故而全部重构了(因为如果在product.py里又要用到people.py岂不是会还要import一次?这样会造成一个包下面的几个文件不断互相导入……)。我曾请教一个朋友,他说这样有违python的思想,变得有些像java了。他还说其实即便将一个.py文件写个上千行,如果安排得当,也是很容易维护和修改的。
qichangxing
2011-04-07 15:41:55 +08:00
“…… 一个.py文件写个上千行,如果安排得当,也是很容易维护和修改的。”
如果你是新手,慎重这种做法。

在 python 里倡导简单、清晰。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/11084

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX