我需要一些帮助来为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))
职位列表包含实际的职位信息;工作名称和投标日期就是所需要的。
承包商包含我们将要出价的实际承包商特有的信息,仅包括电话传真等标准信息。
竞价列表将包含我不确定如何组织的信息。我认为这是正确的方法,但它应该将承包商连接到工作ID。
承包商每份工作只能列一次,但工作可以有很多承包商。
我的问题是,我是否采用这种设计正确的方式或者我是否完全在左侧?我只是想从一开始就采用正确的方式,这样我就有了坚实的基础。
答案 0 :(得分:0)
如果您不需要在BiddingList
对象中存储任何其他信息,只需job_id
和contractor_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">]
- 一切都很好而且透明。
如果您想在多对多关系中存储一些其他信息(例如,承包商在每个role
中可以有不同的JobListing
) - 这是一个名为{的不同模式{3}}
如果您想限制关系,那么每个承包商只需添加一次,我会考虑指定Association Object
现在你知道所有可以使它发挥作用的神奇词语:)
另外一个注意事项 - 尽管网上有一些示例,但您不需要为每个ORM类添加构造函数 - SQLAlchemy提供了一个默认的__init__
方法,该方法接受与列名相匹配的参数: / p>
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())