关于网站Model的组织 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
killall
V2EX    Python

关于网站Model的组织

  •  
  •   killall 2011-04-07 01:47:09 +08:00 5689 次点击
    这是一个创建于 5301 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用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吗?
    13 条回复    1970-01-01 08:00:00 +08:00
    Livid
        1
    Livid  
    MOD
    PRO
       2011-04-07 11:59:20 +08:00
    我目前的做法是用一个 package。

    比如类似这样的结构:

    v2ex/babel/data/models/__init__.py

    用的时候:

    from v2ex.babel.data.models import *
    killall
        2
    killall  
    OP
       2011-04-07 12:25:25 +08:00
    @Livid 嗯,感谢Livid的回答,但是这样的做法貌似会出现当M多大时候的时候出现管理混乱的情况。
    Livid
        3
    Livid  
    MOD
    PRO
       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
        4
    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
        5
    Livid  
    MOD
    PRO
       2011-04-07 13:08:00 +08:00
    @reorx 请教一个初级问题:

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

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

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

    在 python 里倡导简单、清晰。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2710 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 12:56 PVG 20:56 LAX 05:56 JFK 08:56
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86