3

私のweb2pyプロジェクトには、次のような記事の表があります。

db.define_table('articles',
                Field('created_on', 'datetime', default = datetime.today(),
                      required = True, notnull = True,
                      requires = [IS_NOT_EMPTY(),
                                  IS_DATETIME(format=T('%Y-%m-%d %H:%M:%S'))]),
                Field('article_en', 'text', required = True,
                      notnull = True, requires = IS_NOT_EMPTY()))

アップロードされたファイルを追跡する別のファイル:

db.define_table('files',
                Field('filename', 'string', required = True, notnull = True),
                Field('uploaded_data', 'upload', autodelete = True,
                      required = True, notnull = True, requires = IS_NOT_EMPTY()),
                Field('created_on', 'datetime', required = True, notnull = True))

ここで、記事が使用するすべてのファイルの参照と、ファイルが属するすべての記事の参照が必要です。関係を見落として記事を台無しにする危険なしに未使用のファイルを簡単に削除できるように、これが必要です。

より簡単に言えば、関係はこれに非常に近いものです。すべての記事には複数のファイルがあり、すべてのファイルは異なる記事にリンクしています。

私がweb2pyの本から集めたものから、多対多の関係を直接サポートすることはできません。この問題を解決するための簡単な回避策は、リレーションを処理する中間テーブルを使用することですが、明らかに私はデータベースの第一人者ではないため、どのようにすればよいかわかりません。

いくつかの助けをいただければ幸いです!

4

1 に答える 1

4

web2pyは多対多の関係をサポートします。これを行うには、他の2つのテーブルをリンクする中間テーブルを定義します。

db.define_table('article_files',
    Field('article', db.articles),
    Field('file', db.files))

これは回避策ではありませんが、RDBMSでこのタイプの関係を処理するための標準的な方法です。web2pyは、ORMではなくデータベース抽象化レイヤー(DAL)を使用することに注意してください。ORMは通常、中間テーブルを明示的に定義する必要はありませんが、それでも舞台裏で中間テーブルを作成します。

list:referenceフィールドの使用を検討することもできます。

于 2012-07-05T00:44:40.563 に答える