(機械翻訳)ドメインモデルの定義

株式cookiecutterで生成されるアプリケーションの最初の変更は、term: resource`コンストラクタ、wikiページを表すコンストラクタ、およびwikiをページオブジェクトへのマッピングとして表す別の2つを定義することです。これを ` models.py``ファイルの中で行います。

:term: resource tree 'を表すために:term: ZODB`を使用しているので、これらのリソースコンストラクタはそれぞれ、:term: `domain model`オブジェクトを表していますので、これらのコンストラクタ" PageとWikiのコンストラクタはどちらもクラスオブジェクトです。 "Wiki "クラスの1つのインスタンスは"Page "オブジェクトのコンテナとして機能し、"Page "クラスのインスタンスになります。

データベースを削除する

次のステップでは、 `` MyModel`` Pythonモデルクラスを `` models.py``ファイルから削除します。このクラスは永続ストレージ(ディスク上に `` Data.fs``という名前のファイルとして表現されています)内で参照されるため、次にブラウザでアプリケーションを訪問するときに奇妙なことが起こります。続行する前に `` tutorial``ディレクトリから `` Data.fs``を削除してください。データベースの内容を気にしない限り、これはいつでもうまくいきます。データベース自体は必要に応じて再作成されます。

`` models.py``を編集する

注釈

ファイル名 `` models.py``には何も特別なものはありません。プロジェクトのコードベースには、任意の名前のファイルで多くのモデルが存在します。モデルを実装しているファイルは、ファイル名に `` model``を持つことが多く、 `` models``という名前のアプリケーションパッケージのPythonサブパッケージに存在することもありますが、これは慣例によるものです。

`` tutorial / models.py``ファイルを開き、以下のように編集してください:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from persistent import Persistent
from persistent.mapping import PersistentMapping

class Wiki(PersistentMapping):
    __name__ = None
    __parent__ = None

class Page(Persistent):
    def __init__(self, data):
        self.data = data

def appmaker(zodb_root):
    if 'app_root' not in zodb_root:
        app_root = Wiki()
        frontpage = Page('This is the front page')
        app_root['FrontPage'] = frontpage
        frontpage.__name__ = 'FrontPage'
        frontpage.__parent__ = app_root
        zodb_root['app_root'] = app_root
    return zodb_root['app_root']

まず最初に、生成された `` models.py``ファイルから `` MyModel``クラスを削除します。 `` MyModel``クラスは単なるサンプルであり、私たちはそれを使用しません。

次に、:class: persistent.Persistent`クラスの先頭にインポートを追加します。新しい ` Page``クラスにこれを使用します。

次に、 `` Wiki``クラスを追加します。 :class: `persistent.mapping.PersistentMapping`クラスはマッピング動作を提供するので、継承することが望ましく、WikiページがZODBデータベースの"ファーストクラス"永続オブジェクトとして格納されるようにします。

私たちの `` Wiki``クラスは、 `` __parent__``と `` __name__``という2つの属性をクラススコープで `` None``に設定しなければなりません。モデルがトラバーサルベースの:app: Pyramid`アプリケーションで None``の __parent__``属性を持っている場合、それは:term:`ルート `モデルであることを意味します。ルートモデルの ` __name__``も常に `` None``です。

次に、 `` Page``クラスを追加します。このクラスは:class: persistent.Persistent`クラスから継承する必要があります。また、 ` data``という名前の単一のパラメータを受け入れる `` __init__``メソッドを提供します。このパラメータには、wikiページの内容を表す:term: reStructuredText`ボディが含まれます。 ` Page``オブジェクトには初期の `` __name__``や `` __parent__``属性がありません。トラバーサルグラフ内のすべてのオブジェクトには、 `` __name__``と `` __parent__``属性が必要です。これは、WikiマッピングにPageが追加されたときに:term: view`関数によって __name__``と `__parent__``の両方が設定されるため、ここでは指定しません。

最後のステップとして、アプリケーションの:term: root:term:` resource`がWikiのインスタンスになるように、 `` models.py``ファイルの `` appmaker``関数を変更します。また、「appmaker」内のWikiに単一のページオブジェクト(フロントページ)を挿入します。これは:term: traversal a:term:` resource tree`がURLをリソースに解決しようとするときに働くようにします。

ブラウザでアプリケーションを表示する

私たちはできません。この時点で、私たちのシステムは"実行不可能な"状態にあります。次の章のビュー関連のファイルを変更して、アプリケーションを正常に起動できるようにする必要があります。アプリケーションを起動しようとすると(参照:ref: wiki-start-the-application)、あなたはこの例外で終わるコンソールにPythonのトレースバックを書き留めます:

ImportError: cannot import name MyModel

これは、テストを実行しようとした場合にも発生します。