1

我需要一些帮助来为 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 包含实际的工作信息;只需要工作名称和投标日期。

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

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

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

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

4

1 回答 1

0

如果您不需要在BiddingList对象中存储任何其他信息,只需job_idcontractor_id- 这种模式称为多对多关系,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">]

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

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

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

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

另一个注意事项 - 尽管网络上有一些示例,但您不需要为每个 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())
于 2013-03-06T00:09:53.377 回答