【问题标题】:ORM Design using Pyramid and SQL Alchemy使用 Pyramid 和 SQLAlchemy 进行 FORM 设计
【发布时间】:2013-02-20 02:19:50
【问题描述】:

我需要一些帮助来为 ORM 创建模型。

我一直在尝试使用 Pyramid 和 SQLAlchemy 设计一个 Web 应用程序,作为个人学习体验,以及作为我希望为我工作的公司开发的 Web 应用程序的较小组件。

关于此应用程序的一些背景知识(建筑工作领域)。

它将用作我们的估算人员能够更新的投标时间表;以便我们前台的秘书能够看到谁在从事什么工作以及估计该工作的承包商是什么。

我设计了 3 个模型,它们看起来像这样:

class JobListing(Base):
    __tablename__ = 'joblist'
    id = Column(Integer, primary_key=True)
    jobname = Column(String(80), unique=True)
    biddate = Column(DateTime)

    def __init__(self, jobname, biddate):
        self.jobname = jobname
        self.biddate = biddate

class Contractors(Base):
    __tablename__ = 'contractors'
    id = Column(Integer, primary_key=True)
    name = Column(String(80), unique=True)
    address = Column(String(255))
    phone = Column(String(11))
    fax = Column(String(11))

    def __init__(self, name, address, phone, fax):
        self.name = name
        self.address = address
        self.phone = phone
        self.fax = fax

class BiddingList(Base):
    __tablename__ = 'biddinglist'
    id = Column(Integer, primary_key=True)
    job_id = Column(Integer, ForeignKey("joblist.id"))
    job = relationship("JobListing", backref=backref("joblist", order_by=id))
    contractor_id = Column(Integer, ForeignKey("contractors.id"))
    contractors = relationship("Contractors", backref=backref("contractors", order_by=id))

joblisting 包含实际的工作信息;只需要工作名称和投标日期。

Contractors 包含特定于我们将投标的实际承包商的信息,只是标准信息,例如电话传真等。

Biddinglist 将包含我不确定应该如何组织的信息。我相信这是正确的方法,但它应该只是将承包商与工作 ID 联系起来。

每个工作只能列出一次承包商,但该工作可以有多个承包商。

我的问题是,我是通过这种设计以正确的方式接近这一点,还是我完全处于左侧领域?我只想从一开始就以正确的方式去做,这样我就有了坚实的基础。

【问题讨论】:

    标签: python orm sqlalchemy pyramid


    【解决方案1】:

    如果您不需要在 BiddingList 对象中存储任何其他信息,只需 job_idcontractor_id - 这种模式称为 many-to-many relationship,SQLAlchemy 文档有一个如何设置它的示例向上。基本上,在这种情况下,您不需要中间的 ORM 类(尽管您需要一个表),并且在您设置完所有内容后,用法将如下所示

    job = JobListing(jobname="Test Job")
    job.contractors.append(joe)
    job.contractors.append(bob)
    print bob.jobs
    > [<JobListing "Test Job">]
    bob.jobs.append(another_job)
    print bob.jobs
    > [<JobListing "Test Job">, <JobListing "Another Job">]
    

    -- 一切都是美好而透明的。

    如果您想存储一些关于多对多关系的附加信息(例如,承包商可以在每个JobListing 中拥有不同的role)- 这是一种称为Association Object 的不同模式。

    如果您想限制关系以便每个承包商只能添加一次,我会考虑指定 unique constraint

    现在你知道所有让它起作用的神奇词汇了:)

    另外一点 - 尽管网上有一些示例,但您不需要为每个 ORM 类添加构造函数 - SQLAlchemy 提供了一个默认的__init__ 方法,该方法接受与列名称匹配的参数:

    class JobListing(Base):
        __tablename__ = 'joblist'
        id = Column(Integer, primary_key=True)
        jobname = Column(String(80), unique=True)
        biddate = Column(DateTime)
    
    obj = JobListing(jobname="Test Job", biddate=datetime.now())
    

    【讨论】:

    • 感谢您提供的重要信息,这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多