More migration docs, and conversion of all easy syncdb references
This commit is contained in:
parent
06103c8ef5
commit
f8297f6323
|
@ -81,10 +81,10 @@ access to your precious data on a model by model basis.
|
||||||
Install the core Django tables
|
Install the core Django tables
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
Next, run the :djadmin:`syncdb` command to install any extra needed database
|
Next, run the :djadmin:`migrate` command to install any extra needed database
|
||||||
records such as admin permissions and content types::
|
records such as admin permissions and content types::
|
||||||
|
|
||||||
python manage.py syncdb
|
python manage.py migrate
|
||||||
|
|
||||||
Test and tweak
|
Test and tweak
|
||||||
==============
|
==============
|
||||||
|
|
|
@ -165,9 +165,9 @@ __ http://sphinx.pocoo.org/markup/desc.html
|
||||||
|
|
||||||
* ``django-admin`` commands::
|
* ``django-admin`` commands::
|
||||||
|
|
||||||
.. django-admin:: syncdb
|
.. django-admin:: migrate
|
||||||
|
|
||||||
To link, use ``:djadmin:`syncdb```.
|
To link, use ``:djadmin:`migrate```.
|
||||||
|
|
||||||
* ``django-admin`` command-line options::
|
* ``django-admin`` command-line options::
|
||||||
|
|
||||||
|
|
|
@ -53,10 +53,11 @@ automatically:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
manage.py syncdb
|
manage.py migrate
|
||||||
|
|
||||||
The :djadmin:`syncdb` command looks at all your available models and creates
|
The :djadmin:`migrate` command looks at all your available models and creates
|
||||||
tables in your database for whichever tables don't already exist.
|
tables in your database for whichever tables don't already exist, as well as
|
||||||
|
optionally providing :doc:`much richer schema control </topics/migrations>`.
|
||||||
|
|
||||||
Enjoy the free API
|
Enjoy the free API
|
||||||
==================
|
==================
|
||||||
|
|
|
@ -155,7 +155,7 @@ this. For a small app like polls, this process isn't too difficult.
|
||||||
|
|
||||||
url(r'^polls/', include('polls.urls')),
|
url(r'^polls/', include('polls.urls')),
|
||||||
|
|
||||||
3. Run `python manage.py syncdb` to create the polls models.
|
3. Run `python manage.py migrate` to create the polls models.
|
||||||
|
|
||||||
4. Start the development server and visit http://127.0.0.1:8000/admin/
|
4. Start the development server and visit http://127.0.0.1:8000/admin/
|
||||||
to create a poll (you'll need the Admin app enabled).
|
to create a poll (you'll need the Admin app enabled).
|
||||||
|
|
|
@ -45,8 +45,7 @@ Outputs to standard output all data in the database associated with the named
|
||||||
application(s).
|
application(s).
|
||||||
.TP
|
.TP
|
||||||
.BI flush
|
.BI flush
|
||||||
Returns the database to the state it was in immediately after syncdb was
|
Removes all data from the database and then re-installs any initial data.
|
||||||
executed.
|
|
||||||
.TP
|
.TP
|
||||||
.B inspectdb
|
.B inspectdb
|
||||||
Introspects the database tables in the database specified in settings.py and outputs a Django
|
Introspects the database tables in the database specified in settings.py and outputs a Django
|
||||||
|
@ -114,9 +113,9 @@ the current directory or the optional destination.
|
||||||
Creates a Django project directory structure for the given project name
|
Creates a Django project directory structure for the given project name
|
||||||
in the current directory or the optional destination.
|
in the current directory or the optional destination.
|
||||||
.TP
|
.TP
|
||||||
.BI syncdb
|
.BI migrate
|
||||||
Creates the database tables for all apps in INSTALLED_APPS whose tables
|
Runs migrations for apps containing migrations, and just creates missing tables
|
||||||
haven't already been created.
|
for apps without migrations.
|
||||||
.TP
|
.TP
|
||||||
.BI "test [" "\-\-verbosity" "] [" "\-\-failfast" "] [" "appname ..." "]"
|
.BI "test [" "\-\-verbosity" "] [" "\-\-failfast" "] [" "appname ..." "]"
|
||||||
Runs the test suite for the specified applications, or the entire project if
|
Runs the test suite for the specified applications, or the entire project if
|
||||||
|
|
|
@ -31,7 +31,7 @@ To get started using the ``comments`` app, follow these steps:
|
||||||
#. Install the comments framework by adding ``'django.contrib.comments'`` to
|
#. Install the comments framework by adding ``'django.contrib.comments'`` to
|
||||||
:setting:`INSTALLED_APPS`.
|
:setting:`INSTALLED_APPS`.
|
||||||
|
|
||||||
#. Run ``manage.py syncdb`` so that Django will create the comment tables.
|
#. Run ``manage.py migrate`` so that Django will create the comment tables.
|
||||||
|
|
||||||
#. Add the comment app's URLs to your project's ``urls.py``:
|
#. Add the comment app's URLs to your project's ``urls.py``:
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ The ``ContentType`` model
|
||||||
Let's look at an example to see how this works. If you already have
|
Let's look at an example to see how this works. If you already have
|
||||||
the :mod:`~django.contrib.contenttypes` application installed, and then add
|
the :mod:`~django.contrib.contenttypes` application installed, and then add
|
||||||
:mod:`the sites application <django.contrib.sites>` to your
|
:mod:`the sites application <django.contrib.sites>` to your
|
||||||
:setting:`INSTALLED_APPS` setting and run ``manage.py syncdb`` to install it,
|
:setting:`INSTALLED_APPS` setting and run ``manage.py migrate`` to install it,
|
||||||
the model :class:`django.contrib.sites.models.Site` will be installed into
|
the model :class:`django.contrib.sites.models.Site` will be installed into
|
||||||
your database. Along with it a new instance of
|
your database. Along with it a new instance of
|
||||||
:class:`~django.contrib.contenttypes.models.ContentType` will be
|
:class:`~django.contrib.contenttypes.models.ContentType` will be
|
||||||
|
|
|
@ -55,14 +55,14 @@ or:
|
||||||
3. Add ``'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'``
|
3. Add ``'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'``
|
||||||
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
||||||
|
|
||||||
4. Run the command :djadmin:`manage.py syncdb <syncdb>`.
|
4. Run the command :djadmin:`manage.py migrate <migrate>`.
|
||||||
|
|
||||||
.. currentmodule:: django.contrib.flatpages.middleware
|
.. currentmodule:: django.contrib.flatpages.middleware
|
||||||
|
|
||||||
How it works
|
How it works
|
||||||
============
|
============
|
||||||
|
|
||||||
``manage.py syncdb`` creates two tables in your database: ``django_flatpage``
|
``manage.py migrate`` creates two tables in your database: ``django_flatpage``
|
||||||
and ``django_flatpage_sites``. ``django_flatpage`` is a simple lookup table
|
and ``django_flatpage_sites``. ``django_flatpage`` is a simple lookup table
|
||||||
that simply maps a URL to a title and bunch of text content.
|
that simply maps a URL to a title and bunch of text content.
|
||||||
``django_flatpage_sites`` associates a flatpage with a site.
|
``django_flatpage_sites`` associates a flatpage with a site.
|
||||||
|
|
|
@ -15,7 +15,7 @@ those packages have.
|
||||||
For most of these add-ons -- specifically, the add-ons that include either
|
For most of these add-ons -- specifically, the add-ons that include either
|
||||||
models or template tags -- you'll need to add the package name (e.g.,
|
models or template tags -- you'll need to add the package name (e.g.,
|
||||||
``'django.contrib.admin'``) to your :setting:`INSTALLED_APPS` setting and
|
``'django.contrib.admin'``) to your :setting:`INSTALLED_APPS` setting and
|
||||||
re-run ``manage.py syncdb``.
|
re-run ``manage.py migrate``.
|
||||||
|
|
||||||
.. _"batteries included" philosophy: http://docs.python.org/tutorial/stdlib.html#batteries-included
|
.. _"batteries included" philosophy: http://docs.python.org/tutorial/stdlib.html#batteries-included
|
||||||
|
|
||||||
|
|
|
@ -18,12 +18,12 @@ To install the redirects app, follow these steps:
|
||||||
2. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS` setting.
|
2. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS` setting.
|
||||||
3. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'``
|
3. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'``
|
||||||
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
to your :setting:`MIDDLEWARE_CLASSES` setting.
|
||||||
4. Run the command :djadmin:`manage.py syncdb <syncdb>`.
|
4. Run the command :djadmin:`manage.py migrate <migrate>`.
|
||||||
|
|
||||||
How it works
|
How it works
|
||||||
============
|
============
|
||||||
|
|
||||||
``manage.py syncdb`` creates a ``django_redirect`` table in your database. This
|
``manage.py migrate`` creates a ``django_redirect`` table in your database. This
|
||||||
is a simple lookup table with ``site_id``, ``old_path`` and ``new_path`` fields.
|
is a simple lookup table with ``site_id``, ``old_path`` and ``new_path`` fields.
|
||||||
|
|
||||||
The ``RedirectFallbackMiddleware`` does all of the work. Each time any Django
|
The ``RedirectFallbackMiddleware`` does all of the work. Each time any Django
|
||||||
|
|
|
@ -264,7 +264,7 @@ To enable the sites framework, follow these steps:
|
||||||
|
|
||||||
SITE_ID = 1
|
SITE_ID = 1
|
||||||
|
|
||||||
3. Run :djadmin:`syncdb`.
|
3. Run :djadmin:`migrate`.
|
||||||
|
|
||||||
``django.contrib.sites`` registers a
|
``django.contrib.sites`` registers a
|
||||||
:data:`~django.db.models.signals.post_syncdb` signal handler which creates a
|
:data:`~django.db.models.signals.post_syncdb` signal handler which creates a
|
||||||
|
|
|
@ -224,7 +224,7 @@ If you upgrade an existing project to MySQL 5.5.5 and subsequently add some
|
||||||
tables, ensure that your tables are using the same storage engine (i.e. MyISAM
|
tables, ensure that your tables are using the same storage engine (i.e. MyISAM
|
||||||
vs. InnoDB). Specifically, if tables that have a ``ForeignKey`` between them
|
vs. InnoDB). Specifically, if tables that have a ``ForeignKey`` between them
|
||||||
use different storage engines, you may see an error like the following when
|
use different storage engines, you may see an error like the following when
|
||||||
running ``syncdb``::
|
running ``migrate``::
|
||||||
|
|
||||||
_mysql_exceptions.OperationalError: (
|
_mysql_exceptions.OperationalError: (
|
||||||
1005, "Can't create table '\\db_name\\.#sql-4a8_ab' (errno: 150)"
|
1005, "Can't create table '\\db_name\\.#sql-4a8_ab' (errno: 150)"
|
||||||
|
@ -663,7 +663,7 @@ required.
|
||||||
.. _`Oracle Database Server`: http://www.oracle.com/
|
.. _`Oracle Database Server`: http://www.oracle.com/
|
||||||
.. _`cx_Oracle`: http://cx-oracle.sourceforge.net/
|
.. _`cx_Oracle`: http://cx-oracle.sourceforge.net/
|
||||||
|
|
||||||
In order for the ``python manage.py syncdb`` command to work, your Oracle
|
In order for the ``python manage.py migrate`` command to work, your Oracle
|
||||||
database user must have privileges to run the following commands:
|
database user must have privileges to run the following commands:
|
||||||
|
|
||||||
* CREATE TABLE
|
* CREATE TABLE
|
||||||
|
@ -752,7 +752,7 @@ Oracle imposes a name length limit of 30 characters. To accommodate this, the
|
||||||
backend truncates database identifiers to fit, replacing the final four
|
backend truncates database identifiers to fit, replacing the final four
|
||||||
characters of the truncated name with a repeatable MD5 hash value.
|
characters of the truncated name with a repeatable MD5 hash value.
|
||||||
|
|
||||||
When running syncdb, an ``ORA-06552`` error may be encountered if
|
When running ``migrate``, an ``ORA-06552`` error may be encountered if
|
||||||
certain Oracle keywords are used as the name of a model field or the
|
certain Oracle keywords are used as the name of a model field or the
|
||||||
value of a ``db_column`` option. Django quotes all identifiers used
|
value of a ``db_column`` option. Django quotes all identifiers used
|
||||||
in queries to prevent most such problems, but this error can still
|
in queries to prevent most such problems, but this error can still
|
||||||
|
|
|
@ -242,10 +242,8 @@ flush
|
||||||
|
|
||||||
.. django-admin:: flush
|
.. django-admin:: flush
|
||||||
|
|
||||||
Returns the database to the state it was in immediately after :djadmin:`syncdb`
|
Removes all data from the database, re-executes any post-synchronization
|
||||||
was executed. This means that all data will be removed from the database, any
|
handlers, and reinstalls any initial data fixtures.
|
||||||
post-synchronization handlers will be re-executed, and the ``initial_data``
|
|
||||||
fixture will be re-installed.
|
|
||||||
|
|
||||||
The :djadminopt:`--noinput` option may be provided to suppress all user
|
The :djadminopt:`--noinput` option may be provided to suppress all user
|
||||||
prompts.
|
prompts.
|
||||||
|
@ -1293,7 +1291,7 @@ This command is only available if Django's :doc:`authentication system
|
||||||
|
|
||||||
Creates a superuser account (a user who has all permissions). This is
|
Creates a superuser account (a user who has all permissions). This is
|
||||||
useful if you need to create an initial superuser account but did not
|
useful if you need to create an initial superuser account but did not
|
||||||
do so during ``syncdb``, or if you need to programmatically generate
|
do so during the first ``migrate``, or if you need to programmatically generate
|
||||||
superuser accounts for your site(s).
|
superuser accounts for your site(s).
|
||||||
|
|
||||||
When run interactively, this command will prompt for a password for
|
When run interactively, this command will prompt for a password for
|
||||||
|
@ -1379,7 +1377,7 @@ allows for the following options:
|
||||||
|
|
||||||
Example usage::
|
Example usage::
|
||||||
|
|
||||||
django-admin.py syncdb --pythonpath='/home/djangoprojects/myproject'
|
django-admin.py migrate --pythonpath='/home/djangoprojects/myproject'
|
||||||
|
|
||||||
Adds the given filesystem path to the Python `import search path`_. If this
|
Adds the given filesystem path to the Python `import search path`_. If this
|
||||||
isn't provided, ``django-admin.py`` will use the ``PYTHONPATH`` environment
|
isn't provided, ``django-admin.py`` will use the ``PYTHONPATH`` environment
|
||||||
|
@ -1394,7 +1392,7 @@ setting the Python path for you.
|
||||||
|
|
||||||
Example usage::
|
Example usage::
|
||||||
|
|
||||||
django-admin.py syncdb --settings=mysite.settings
|
django-admin.py migrate --settings=mysite.settings
|
||||||
|
|
||||||
Explicitly specifies the settings module to use. The settings module should be
|
Explicitly specifies the settings module to use. The settings module should be
|
||||||
in Python package syntax, e.g. ``mysite.settings``. If this isn't provided,
|
in Python package syntax, e.g. ``mysite.settings``. If this isn't provided,
|
||||||
|
@ -1408,7 +1406,7 @@ Note that this option is unnecessary in ``manage.py``, because it uses
|
||||||
|
|
||||||
Example usage::
|
Example usage::
|
||||||
|
|
||||||
django-admin.py syncdb --traceback
|
django-admin.py migrate --traceback
|
||||||
|
|
||||||
By default, ``django-admin.py`` will show a simple error message whenever an
|
By default, ``django-admin.py`` will show a simple error message whenever an
|
||||||
:class:`~django.core.management.CommandError` occurs, but a full stack trace
|
:class:`~django.core.management.CommandError` occurs, but a full stack trace
|
||||||
|
@ -1424,7 +1422,7 @@ will also output a full stack trace when a ``CommandError`` is raised.
|
||||||
|
|
||||||
Example usage::
|
Example usage::
|
||||||
|
|
||||||
django-admin.py syncdb --verbosity 2
|
django-admin.py migrate --verbosity 2
|
||||||
|
|
||||||
Use ``--verbosity`` to specify the amount of notification and debug information
|
Use ``--verbosity`` to specify the amount of notification and debug information
|
||||||
that ``django-admin.py`` should print to the console.
|
that ``django-admin.py`` should print to the console.
|
||||||
|
|
|
@ -106,9 +106,9 @@ Django quotes column and table names behind the scenes.
|
||||||
.. attribute:: Options.managed
|
.. attribute:: Options.managed
|
||||||
|
|
||||||
Defaults to ``True``, meaning Django will create the appropriate database
|
Defaults to ``True``, meaning Django will create the appropriate database
|
||||||
tables in :djadmin:`syncdb` and remove them as part of a :djadmin:`flush`
|
tables in :djadmin:`migrate` or as part of migrations and remove them as
|
||||||
management command. That is, Django *manages* the database tables'
|
part of a :djadmin:`flush` management command. That is, Django
|
||||||
lifecycles.
|
*manages* the database tables' lifecycles.
|
||||||
|
|
||||||
If ``False``, no database table creation or deletion operations will be
|
If ``False``, no database table creation or deletion operations will be
|
||||||
performed for this model. This is useful if the model represents an existing
|
performed for this model. This is useful if the model represents an existing
|
||||||
|
@ -192,9 +192,9 @@ Django quotes column and table names behind the scenes.
|
||||||
.. admonition:: Changing order_with_respect_to
|
.. admonition:: Changing order_with_respect_to
|
||||||
|
|
||||||
``order_with_respect_to`` adds an additional field/database column
|
``order_with_respect_to`` adds an additional field/database column
|
||||||
named ``_order``, so be sure to handle that as you would any other
|
named ``_order``, so be sure to make and apply the appropriate
|
||||||
change to your models if you add or change ``order_with_respect_to``
|
migrations if you add or change ``order_with_respect_to``
|
||||||
after your initial :djadmin:`syncdb`.
|
after your initial :djadmin:`migrate`.
|
||||||
|
|
||||||
``ordering``
|
``ordering``
|
||||||
------------
|
------------
|
||||||
|
|
|
@ -275,7 +275,7 @@ can or cannot do with Task instances, specific to your application::
|
||||||
)
|
)
|
||||||
|
|
||||||
The only thing this does is create those extra permissions when you run
|
The only thing this does is create those extra permissions when you run
|
||||||
:djadmin:`manage.py syncdb <syncdb>`. Your code is in charge of checking the
|
:djadmin:`manage.py migrate <migrate>`. Your code is in charge of checking the
|
||||||
value of these permissions when an user is trying to access the functionality
|
value of these permissions when an user is trying to access the functionality
|
||||||
provided by the application (viewing tasks, changing the status of tasks,
|
provided by the application (viewing tasks, changing the status of tasks,
|
||||||
closing tasks.) Continuing the above example, the following checks if a user may
|
closing tasks.) Continuing the above example, the following checks if a user may
|
||||||
|
@ -380,14 +380,12 @@ use as your User model.
|
||||||
Changing :setting:`AUTH_USER_MODEL` has a big effect on your database
|
Changing :setting:`AUTH_USER_MODEL` has a big effect on your database
|
||||||
structure. It changes the tables that are available, and it will affect the
|
structure. It changes the tables that are available, and it will affect the
|
||||||
construction of foreign keys and many-to-many relationships. If you intend
|
construction of foreign keys and many-to-many relationships. If you intend
|
||||||
to set :setting:`AUTH_USER_MODEL`, you should set it before running
|
to set :setting:`AUTH_USER_MODEL`, you should set it before creating
|
||||||
``manage.py syncdb`` for the first time.
|
any migrations or running ``manage.py migrate`` for the first time.
|
||||||
|
|
||||||
If you have an existing project and you want to migrate to using a custom
|
Changing this setting after you have tables created is not supported
|
||||||
User model, you may need to look into using a migration tool like South_
|
by :djadmin:`makemigrations` and will result in you having to manually
|
||||||
to ease the transition.
|
write a set of migrations to fix your schema.
|
||||||
|
|
||||||
.. _South: http://south.aeracode.org
|
|
||||||
|
|
||||||
Referencing the User model
|
Referencing the User model
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
|
@ -65,7 +65,7 @@ interactively <auth-admin>`.
|
||||||
Creating superusers
|
Creating superusers
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
:djadmin:`manage.py syncdb <syncdb>` prompts you to create a superuser the
|
:djadmin:`manage.py migrate <migrate>` prompts you to create a superuser the
|
||||||
first time you run it with ``'django.contrib.auth'`` in your
|
first time you run it with ``'django.contrib.auth'`` in your
|
||||||
:setting:`INSTALLED_APPS`. If you need to create a superuser at a later date,
|
:setting:`INSTALLED_APPS`. If you need to create a superuser at a later date,
|
||||||
you can use a command line utility::
|
you can use a command line utility::
|
||||||
|
@ -190,13 +190,13 @@ setting, it will ensure that three default permissions -- add, change and
|
||||||
delete -- are created for each Django model defined in one of your installed
|
delete -- are created for each Django model defined in one of your installed
|
||||||
applications.
|
applications.
|
||||||
|
|
||||||
These permissions will be created when you run :djadmin:`manage.py syncdb
|
These permissions will be created when you run :djadmin:`manage.py migrate
|
||||||
<syncdb>`; the first time you run ``syncdb`` after adding
|
<migrate>`; the first time you run ``migrate`` after adding
|
||||||
``django.contrib.auth`` to :setting:`INSTALLED_APPS`, the default permissions
|
``django.contrib.auth`` to :setting:`INSTALLED_APPS`, the default permissions
|
||||||
will be created for all previously-installed models, as well as for any new
|
will be created for all previously-installed models, as well as for any new
|
||||||
models being installed at that time. Afterward, it will create default
|
models being installed at that time. Afterward, it will create default
|
||||||
permissions for new models each time you run :djadmin:`manage.py syncdb
|
permissions for new models each time you run :djadmin:`manage.py migrate
|
||||||
<syncdb>`.
|
<migrate>`.
|
||||||
|
|
||||||
Assuming you have an application with an
|
Assuming you have an application with an
|
||||||
:attr:`~django.db.models.Options.app_label` ``foo`` and a model named ``Bar``,
|
:attr:`~django.db.models.Options.app_label` ``foo`` and a model named ``Bar``,
|
||||||
|
|
|
@ -67,7 +67,7 @@ and two items in your :setting:`MIDDLEWARE_CLASSES` setting:
|
||||||
2. :class:`~django.contrib.auth.middleware.AuthenticationMiddleware` associates
|
2. :class:`~django.contrib.auth.middleware.AuthenticationMiddleware` associates
|
||||||
users with requests using sessions.
|
users with requests using sessions.
|
||||||
|
|
||||||
With these settings in place, running the command ``manage.py syncdb`` creates
|
With these settings in place, running the command ``manage.py migrate`` creates
|
||||||
the necessary database tables for auth related models, creates permissions for
|
the necessary database tables for auth related models, creates permissions for
|
||||||
any models defined in your installed apps, and prompts you to create
|
any models defined in your installed apps, and prompts you to create
|
||||||
a superuser account the first time you run it.
|
a superuser account the first time you run it.
|
||||||
|
|
|
@ -77,7 +77,8 @@ application by the :djadmin:`manage.py startapp <startapp>` script),
|
||||||
)
|
)
|
||||||
|
|
||||||
When you add new apps to :setting:`INSTALLED_APPS`, be sure to run
|
When you add new apps to :setting:`INSTALLED_APPS`, be sure to run
|
||||||
:djadmin:`manage.py syncdb <syncdb>`.
|
:djadmin:`manage.py migrate <migrate>`, optionally making migrations
|
||||||
|
for them first with :djadmin:`manage.py makemigrations <makemigrations>`.
|
||||||
|
|
||||||
Fields
|
Fields
|
||||||
======
|
======
|
||||||
|
@ -956,7 +957,7 @@ The reverse name of the ``common.ChildA.m2m`` field will be
|
||||||
reverse name of the ``rare.ChildB.m2m`` field will be ``rare_childb_related``.
|
reverse name of the ``rare.ChildB.m2m`` field will be ``rare_childb_related``.
|
||||||
It is up to you how you use the ``'%(class)s'`` and ``'%(app_label)s`` portion
|
It is up to you how you use the ``'%(class)s'`` and ``'%(app_label)s`` portion
|
||||||
to construct your related name, but if you forget to use it, Django will raise
|
to construct your related name, but if you forget to use it, Django will raise
|
||||||
errors when you validate your models (or run :djadmin:`syncdb`).
|
errors when you validate your models (or run :djadmin:`migrate`).
|
||||||
|
|
||||||
If you don't specify a :attr:`~django.db.models.ForeignKey.related_name`
|
If you don't specify a :attr:`~django.db.models.ForeignKey.related_name`
|
||||||
attribute for a field in an abstract base class, the default reverse name will
|
attribute for a field in an abstract base class, the default reverse name will
|
||||||
|
@ -1049,7 +1050,7 @@ are putting those types of relations on a subclass of another model,
|
||||||
you **must** specify the
|
you **must** specify the
|
||||||
:attr:`~django.db.models.ForeignKey.related_name` attribute on each
|
:attr:`~django.db.models.ForeignKey.related_name` attribute on each
|
||||||
such field. If you forget, Django will raise an error when you run
|
such field. If you forget, Django will raise an error when you run
|
||||||
:djadmin:`validate` or :djadmin:`syncdb`.
|
:djadmin:`validate` or :djadmin:`migrate`.
|
||||||
|
|
||||||
For example, using the above ``Place`` class again, let's create another
|
For example, using the above ``Place`` class again, let's create another
|
||||||
subclass with a :class:`~django.db.models.ManyToManyField`::
|
subclass with a :class:`~django.db.models.ManyToManyField`::
|
||||||
|
|
|
@ -44,7 +44,7 @@ Using database-backed sessions
|
||||||
If you want to use a database-backed session, you need to add
|
If you want to use a database-backed session, you need to add
|
||||||
``'django.contrib.sessions'`` to your :setting:`INSTALLED_APPS` setting.
|
``'django.contrib.sessions'`` to your :setting:`INSTALLED_APPS` setting.
|
||||||
|
|
||||||
Once you have configured your installation, run ``manage.py syncdb``
|
Once you have configured your installation, run ``manage.py migrate``
|
||||||
to install the single database table that stores session data.
|
to install the single database table that stores session data.
|
||||||
|
|
||||||
.. _cached-sessions-backend:
|
.. _cached-sessions-backend:
|
||||||
|
|
|
@ -122,14 +122,12 @@ database bindings are installed.
|
||||||
* If you're using an unofficial 3rd party backend, please consult the
|
* If you're using an unofficial 3rd party backend, please consult the
|
||||||
documentation provided for any additional requirements.
|
documentation provided for any additional requirements.
|
||||||
|
|
||||||
If you plan to use Django's ``manage.py syncdb`` command to automatically
|
If you plan to use Django's ``manage.py migrate`` command to automatically
|
||||||
create database tables for your models (after first installing Django and
|
create database tables for your models (after first installing Django and
|
||||||
creating a project), you'll need to ensure that Django has permission to create
|
creating a project), you'll need to ensure that Django has permission to create
|
||||||
and alter tables in the database you're using; if you plan to manually create
|
and alter tables in the database you're using; if you plan to manually create
|
||||||
the tables, you can simply grant Django ``SELECT``, ``INSERT``, ``UPDATE`` and
|
the tables, you can simply grant Django ``SELECT``, ``INSERT``, ``UPDATE`` and
|
||||||
``DELETE`` permissions. On some databases, Django will need ``ALTER TABLE``
|
``DELETE`` permissions. After creating a database user with these
|
||||||
privileges during ``syncdb`` but won't issue ``ALTER TABLE`` statements on a
|
|
||||||
table once ``syncdb`` has created it. After creating a database user with these
|
|
||||||
permissions, you'll specify the details in your project's settings file,
|
permissions, you'll specify the details in your project's settings file,
|
||||||
see :setting:`DATABASES` for details.
|
see :setting:`DATABASES` for details.
|
||||||
|
|
||||||
|
|
|
@ -111,3 +111,113 @@ production environment unless you are very aware of the risks and
|
||||||
its limitations; the support Django ships with is designed to allow
|
its limitations; the support Django ships with is designed to allow
|
||||||
developers to use SQLite on their local machines to develop less complex
|
developers to use SQLite on their local machines to develop less complex
|
||||||
Django projects without the need for a full database.
|
Django projects without the need for a full database.
|
||||||
|
|
||||||
|
Workflow
|
||||||
|
--------
|
||||||
|
|
||||||
|
Working with migrations is simple. Make changes to your models - say, add
|
||||||
|
a field and remove a model - and then run :djadmin:`makemigrations`::
|
||||||
|
|
||||||
|
$ python manage.py makemigrations
|
||||||
|
Migrations for 'books':
|
||||||
|
0003_auto.py:
|
||||||
|
- Alter field author on book
|
||||||
|
|
||||||
|
Your models will be scanned and compared to the versions currently
|
||||||
|
contained in your migration files, and then a new set of migrations
|
||||||
|
will be written out. Make sure to read the output to see what
|
||||||
|
``makemigrations`` thinks you have changed - it's not perfect, and for
|
||||||
|
complex changes it might not be detecting what you expect.
|
||||||
|
|
||||||
|
Once you have your new migration files, you should apply them to your
|
||||||
|
database to make sure they work as expected::
|
||||||
|
|
||||||
|
$ python manage.py migrate
|
||||||
|
Operations to perform:
|
||||||
|
Synchronize unmigrated apps: sessions, admin, messages, auth, staticfiles, contenttypes
|
||||||
|
Apply all migrations: books
|
||||||
|
Synchronizing apps without migrations:
|
||||||
|
Creating tables...
|
||||||
|
Installing custom SQL...
|
||||||
|
Installing indexes...
|
||||||
|
Installed 0 object(s) from 0 fixture(s)
|
||||||
|
Running migrations:
|
||||||
|
Applying books.0003_auto... OK
|
||||||
|
|
||||||
|
The command runs in two stages; first, it synchronizes unmigrated apps
|
||||||
|
(performing the same functionality that ``syncdb`` used to provide), and
|
||||||
|
then it runs any migrations that have not yet been applied.
|
||||||
|
|
||||||
|
Once the migration is applied, commit the migration and the models change
|
||||||
|
to your version control system as a single commit - that way, when other
|
||||||
|
developers (or your production servers) check out the code, they'll
|
||||||
|
get both the changes to your models and the accompanying migration at the
|
||||||
|
same time.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
------------
|
||||||
|
|
||||||
|
While migrations are per-app, the tables and relationships implied by
|
||||||
|
your models are too complex to be created for just one app at a time. When
|
||||||
|
you make a migration that requires something else to run - for example,
|
||||||
|
you add a ForeignKey in your ``books`` app to your ``authors`` app - the
|
||||||
|
resulting migration will contain a dependency on a migration in ``authors``.
|
||||||
|
|
||||||
|
This means that when you run the migrations, the ``authors`` migration runs
|
||||||
|
first and creates the table the ForeignKey references, and then the migration
|
||||||
|
that makes the ForeignKey column runs afterwards and creates the constraint.
|
||||||
|
If this didn't happen, the migration would try to create the ForeignKey column
|
||||||
|
without the table it's referencing existing and your database would
|
||||||
|
throw an error.
|
||||||
|
|
||||||
|
This dependency behaviour affects most migration operations where you
|
||||||
|
restrict to a single app. Restricting to a single app (either in
|
||||||
|
``makemigrations`` or ``migrate``) is a best-efforts promise, and not
|
||||||
|
a guarantee; any other apps that need to be used to get dependencies correct
|
||||||
|
will be.
|
||||||
|
|
||||||
|
Migration files
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Migrations are stored as an on-disk format, referred to here as
|
||||||
|
"migration files". These files are actually just normal Python files with
|
||||||
|
an agreed-upon object layout, written in a declarative style.
|
||||||
|
|
||||||
|
A basic migration file looks like this::
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [("migrations", "0001_initial")]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.DeleteModel("Tribble"),
|
||||||
|
migrations.AddField("Author", "rating", models.IntegerField(default=0)),
|
||||||
|
]
|
||||||
|
|
||||||
|
What Django looks for when it loads a migration file (as a Python module) is
|
||||||
|
a subclass of ``django.db.migrations.Migration`` called ``Migration``. It then
|
||||||
|
inspects this object for four attributes, only two of which are used
|
||||||
|
most of the time:
|
||||||
|
|
||||||
|
* ``dependencies``, a list of migrations this one depends on.
|
||||||
|
* ``operations``, a list of Operation classes that define what this migration
|
||||||
|
does.
|
||||||
|
|
||||||
|
The operations are the key; they are a set of declarative instructions which
|
||||||
|
tell Django what schema changes need to be made. Django scans them and
|
||||||
|
builds an in-memory representation of all of the schema changes to all apps,
|
||||||
|
and uses this to generate the SQL which makes the schema changes.
|
||||||
|
|
||||||
|
That in-memory structure is also used to work out what the differences are
|
||||||
|
between your models and the current state of your migrations; Django runs
|
||||||
|
through all the changes, in order, on an in-memory set of models to come
|
||||||
|
up with the state of your models last time you ran ``makemigrations``. It
|
||||||
|
then uses these models to compare against the ones in your ``models.py`` files
|
||||||
|
to work out what you have changed.
|
||||||
|
|
||||||
|
You should rarely, if ever, need to edit migration files by hand, but
|
||||||
|
it's entirely possible to write them manually if you need to. Some of the
|
||||||
|
more complex operations are not autodetectable and are only available via
|
||||||
|
a hand-written migration, so don't be scared about editing them if you have to.
|
||||||
|
|
|
@ -296,7 +296,7 @@ serialize an object that refers to a content type, then you need to have a way
|
||||||
to refer to that content type to begin with. Since ``ContentType`` objects are
|
to refer to that content type to begin with. Since ``ContentType`` objects are
|
||||||
automatically created by Django during the database synchronization process,
|
automatically created by Django during the database synchronization process,
|
||||||
the primary key of a given content type isn't easy to predict; it will
|
the primary key of a given content type isn't easy to predict; it will
|
||||||
depend on how and when :djadmin:`syncdb` was executed. This is true for all
|
depend on how and when :djadmin:`migrate` was executed. This is true for all
|
||||||
models which automatically generate objects, notably including
|
models which automatically generate objects, notably including
|
||||||
:class:`~django.contrib.auth.models.Permission`,
|
:class:`~django.contrib.auth.models.Permission`,
|
||||||
:class:`~django.contrib.auth.models.Group`, and
|
:class:`~django.contrib.auth.models.Group`, and
|
||||||
|
|
|
@ -278,7 +278,7 @@ testing behavior. This behavior involves:
|
||||||
|
|
||||||
#. Creating the test databases.
|
#. Creating the test databases.
|
||||||
|
|
||||||
#. Running ``syncdb`` to install models and initial data into the test
|
#. Running ``migrate`` to install models and initial data into the test
|
||||||
databases.
|
databases.
|
||||||
|
|
||||||
#. Running the tests that were found.
|
#. Running the tests that were found.
|
||||||
|
@ -469,7 +469,7 @@ can be useful during testing.
|
||||||
|
|
||||||
.. function:: create_test_db([verbosity=1, autoclobber=False])
|
.. function:: create_test_db([verbosity=1, autoclobber=False])
|
||||||
|
|
||||||
Creates a new test database and runs ``syncdb`` against it.
|
Creates a new test database and runs ``migrate`` against it.
|
||||||
|
|
||||||
``verbosity`` has the same behavior as in ``run_tests()``.
|
``verbosity`` has the same behavior as in ``run_tests()``.
|
||||||
|
|
||||||
|
|
|
@ -1215,9 +1215,9 @@ documentation<dumpdata>` for more details.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
If you've ever run :djadmin:`manage.py syncdb<syncdb>`, you've
|
If you've ever run :djadmin:`manage.py migrate<migrate>`, you've
|
||||||
already used a fixture without even knowing it! When you call
|
already used a fixture without even knowing it! When you call
|
||||||
:djadmin:`syncdb` in the database for the first time, Django
|
:djadmin:`migrate` in the database for the first time, Django
|
||||||
installs a fixture called ``initial_data``. This gives you a way
|
installs a fixture called ``initial_data``. This gives you a way
|
||||||
of populating a new database with any initial data, such as a
|
of populating a new database with any initial data, such as a
|
||||||
default set of categories.
|
default set of categories.
|
||||||
|
|
Loading…
Reference in New Issue