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 には実際のジョブ情報が含まれています。ジョブ名と入札日だけで十分です。

請負業者には、入札する実際の請負業者に固有の情報が含まれています。電話、ファックスなどの標準的な情報のみです。

入札リストには、どのように整理すればよいかわからない情報が含まれます。これは正しい方法だと思いますが、請負業者をジョブIDに接続するだけです。

請負業者は、ジョブごとに 1 つしかリストできませんが、ジョブには多数の請負業者を含めることができます。

私の質問は、このデザインでこれに正しい方法でアプローチしていますか、それとも完全に左翼手ではないですか? 最初から正しい方法で取り組みたいと思っているので、しっかりとした基盤を築いています。

4

1 に答える 1

0

BiddingListオブジェクトに追加情報を保存する必要がない場合は、job_idこのcontractor_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それぞれに異なる を持つことができます)、これはAssociation ObjectJobListingと呼ばれる別のパターンです。

すべての請負業者を一度だけ追加できるように関係を制限したい場合は、一意の制約を指定することを検討します

これで、それを機能させる魔法の言葉がすべてわかりました:)

追加の注意事項 - ネット上のいくつかの例にもかかわらず、各 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 に答える