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 · 5259 次点击
    这是一个创建于 4767 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用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
       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
       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
       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   ·   我们的愿景   ·   实用小工具   ·   1055 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 19:24 · PVG 03:24 · LAX 12:24 · JFK 15:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.