summaryrefslogtreecommitdiff
path: root/docs/tutorials/bfgwiki2/definingmodels.rst
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-01 01:28:07 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-01 01:28:07 +0000
commit01223745750e9359f88446ce646e36563b5baabe (patch)
treefc6a04ea29846d522930e154b715021a89e12247 /docs/tutorials/bfgwiki2/definingmodels.rst
parent0516a00365992b33de92481980c419501f9a9f65 (diff)
downloadpyramid-01223745750e9359f88446ce646e36563b5baabe.tar.gz
pyramid-01223745750e9359f88446ce646e36563b5baabe.tar.bz2
pyramid-01223745750e9359f88446ce646e36563b5baabe.zip
Add defining models chapter.
Diffstat (limited to 'docs/tutorials/bfgwiki2/definingmodels.rst')
-rw-r--r--docs/tutorials/bfgwiki2/definingmodels.rst63
1 files changed, 63 insertions, 0 deletions
diff --git a/docs/tutorials/bfgwiki2/definingmodels.rst b/docs/tutorials/bfgwiki2/definingmodels.rst
new file mode 100644
index 000000000..334f87890
--- /dev/null
+++ b/docs/tutorials/bfgwiki2/definingmodels.rst
@@ -0,0 +1,63 @@
+===============
+Defining Models
+===============
+
+The first change we'll make to our bone-stock paster-generated
+application will be to define a:term:`model` constructor representing
+a wiki page. We'll do this inside our ``models.py`` file.
+
+Making Edits to ``models.py``
+-----------------------------
+
+.. note::
+
+ There is nothing automagically special about the filename
+ ``models.py``. A project may have many models throughout its
+ codebase in arbitrarily-named files. Files implementing models
+ often have ``model`` in their filenames (or they may live in a
+ Python subpackage of your application package named ``models``) ,
+ but this is only by convention.
+
+The first thing we want to do is remove the stock ``Model`` class from
+the generated ``models.py`` file. The ``Model`` class is only a
+sample and we're not going to use it.
+
+Then, we'll add a ``Page`` class. Because this is a SQLAlchemy
+application, this class should inherit from an instance of
+``sqlalchemy.ext.declarative.declarative_base``. Declarative
+SQLAlchemy models are easier to use than directly-mapped ones. The
+code generated by our ``routesalchemy`` paster template does not use
+declarative SQLAlchemy syntax, so we'll need to chage various things to
+begin to use declarative syntax.
+
+Our ``Page`` class will have a class level attributes
+``__tablename__`` which equals the string ``pages``. This means that
+SQLAlchemy will store our wiki data in a SQL table named ``pages``.
+Our Page class will also have class-level attributes named ``id``,
+``pagename`` and ``data`` (all instances of ``sqlalchemy.Column``).
+These will map to columns in the ``pages`` table. The ``id``
+attribute will be the primary key in the table. The ``name``
+attribute will be a text attribute, each value of which needs to be
+unique within the column. The ``data`` attribute is a text attribute
+that will hold the body of each page.
+
+We'll also remove our ``populate`` function. We'll inline the
+populate step into ``initialize_sql``, changing our ``initialize_sql``
+function to add a FrontPage object to our database at startup time.
+We're also going to use slightly different binding syntax. It will
+will otherwise largely be the same as the ``initialize_sql`` in the
+paster-generated ``models.py``.
+
+Our DBSession assignment stays the same as the original generated
+``models.py``.
+
+Looking at the Result of Our Edits to ``models.py``
+---------------------------------------------------
+
+The result of all of our edits to ``models.py`` will end up looking
+something like this:
+
+.. literalinclude:: src/models/tutorial/models.py
+ :linenos:
+ :language: python
+