123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 |
- ======================
- Model ``Meta`` options
- ======================
- This document explains all the possible :ref:`metadata options
- <meta-options>` that you can give your model in its internal
- ``class Meta``.
- Available ``Meta`` options
- ==========================
- .. currentmodule:: django.db.models
- ``abstract``
- ------------
- .. attribute:: Options.abstract
- If ``abstract = True``, this model will be an
- :ref:`abstract base class <abstract-base-classes>`.
- ``app_label``
- -------------
- .. attribute:: Options.app_label
- If a model is defined outside of an application in
- :setting:`INSTALLED_APPS`, it must declare which app it belongs to::
- app_label = "myapp"
- If you want to represent a model with the format ``app_label.object_name``
- or ``app_label.model_name`` you can use ``model._meta.label``
- or ``model._meta.label_lower`` respectively.
- ``base_manager_name``
- ---------------------
- .. attribute:: Options.base_manager_name
- The attribute name of the manager, for example, ``'objects'``, to use for
- the model's :attr:`~django.db.models.Model._base_manager`.
- ``db_table``
- ------------
- .. attribute:: Options.db_table
- The name of the database table to use for the model::
- db_table = "music_album"
- .. _table-names:
- Table names
- ~~~~~~~~~~~
- To save you time, Django automatically derives the name of the database table
- from the name of your model class and the app that contains it. A model's
- database table name is constructed by joining the model's "app label" -- the
- name you used in :djadmin:`manage.py startapp <startapp>` -- to the model's
- class name, with an underscore between them.
- For example, if you have an app ``bookstore`` (as created by
- ``manage.py startapp bookstore``), a model defined as ``class Book`` will have
- a database table named ``bookstore_book``.
- To override the database table name, use the ``db_table`` parameter in
- ``class Meta``.
- If your database table name is an SQL reserved word, or contains characters that
- aren't allowed in Python variable names -- notably, the hyphen -- that's OK.
- Django quotes column and table names behind the scenes.
- .. admonition:: Use lowercase table names for MariaDB and MySQL
- It is strongly advised that you use lowercase table names when you override
- the table name via ``db_table``, particularly if you are using the MySQL
- backend. See the :ref:`MySQL notes <mysql-notes>` for more details.
- .. admonition:: Table name quoting for Oracle
- In order to meet the 30-char limitation Oracle has on table names,
- and match the usual conventions for Oracle databases, Django may shorten
- table names and turn them all-uppercase. To prevent such transformations,
- use a quoted name as the value for ``db_table``::
- db_table = '"name_left_in_lowercase"'
- Such quoted names can also be used with Django's other supported database
- backends; except for Oracle, however, the quotes have no effect. See the
- :ref:`Oracle notes <oracle-notes>` for more details.
- ``db_table_comment``
- --------------------
- .. attribute:: Options.db_table_comment
- The comment on the database table to use for this model. It is useful for
- documenting database tables for individuals with direct database access who may
- not be looking at your Django code. For example::
- class Answer(models.Model):
- question = models.ForeignKey(Question, on_delete=models.CASCADE)
- answer = models.TextField()
- class Meta:
- db_table_comment = "Question answers"
- ``db_tablespace``
- -----------------
- .. attribute:: Options.db_tablespace
- The name of the :doc:`database tablespace </topics/db/tablespaces>` to use
- for this model. The default is the project's :setting:`DEFAULT_TABLESPACE`
- setting, if set. If the backend doesn't support tablespaces, this option is
- ignored.
- ``default_manager_name``
- ------------------------
- .. attribute:: Options.default_manager_name
- The name of the manager to use for the model's
- :attr:`~django.db.models.Model._default_manager`.
- ``default_related_name``
- ------------------------
- .. attribute:: Options.default_related_name
- The name that will be used by default for the relation from a related object
- back to this one. The default is ``<model_name>_set``.
- This option also sets :attr:`~ForeignKey.related_query_name`.
- As the reverse name for a field should be unique, be careful if you intend
- to subclass your model. To work around name collisions, part of the name
- should contain ``'%(app_label)s'`` and ``'%(model_name)s'``, which are
- replaced respectively by the name of the application the model is in,
- and the name of the model, both lowercased. See the paragraph on
- :ref:`related names for abstract models <abstract-related-name>`.
- ``get_latest_by``
- -----------------
- .. attribute:: Options.get_latest_by
- The name of a field or a list of field names in the model, typically
- :class:`DateField`, :class:`DateTimeField`, or :class:`IntegerField`. This
- specifies the default field(s) to use in your model :class:`Manager`’s
- :meth:`~django.db.models.query.QuerySet.latest` and
- :meth:`~django.db.models.query.QuerySet.earliest` methods.
- Example::
- # Latest by ascending order_date.
- get_latest_by = "order_date"
- # Latest by priority descending, order_date ascending.
- get_latest_by = ["-priority", "order_date"]
- See the :meth:`~django.db.models.query.QuerySet.latest` docs for more.
- ``managed``
- -----------
- .. attribute:: Options.managed
- Defaults to ``True``, meaning Django will create the appropriate database
- tables in :djadmin:`migrate` or as part of migrations and remove them as
- part of a :djadmin:`flush` management command. That is, Django
- *manages* the database tables' lifecycles.
- If ``False``, no database table creation, modification, or deletion
- operations will be performed for this model. This is useful if the model
- represents an existing table or a database view that has been created by
- some other means. This is the *only* difference when ``managed=False``. All
- other aspects of model handling are exactly the same as normal. This
- includes
- #. Adding an automatic primary key field to the model if you don't
- declare it. To avoid confusion for later code readers, it's
- recommended to specify all the columns from the database table you
- are modeling when using unmanaged models.
- #. If a model with ``managed=False`` contains a
- :class:`~django.db.models.ManyToManyField` that points to another
- unmanaged model, then the intermediate table for the many-to-many
- join will also not be created. However, the intermediary table
- between one managed and one unmanaged model *will* be created.
- If you need to change this default behavior, create the intermediary
- table as an explicit model (with ``managed`` set as needed) and use
- the :attr:`ManyToManyField.through` attribute to make the relation
- use your custom model.
- For tests involving models with ``managed=False``, it's up to you to ensure
- the correct tables are created as part of the test setup.
- If you're interested in changing the Python-level behavior of a model class,
- you *could* use ``managed=False`` and create a copy of an existing model.
- However, there's a better approach for that situation: :ref:`proxy-models`.
- ``order_with_respect_to``
- -------------------------
- .. attribute:: Options.order_with_respect_to
- Makes this object orderable with respect to the given field, usually a
- ``ForeignKey``. This can be used to make related objects orderable with
- respect to a parent object. For example, if an ``Answer`` relates to a
- ``Question`` object, and a question has more than one answer, and the order
- of answers matters, you'd do this::
- from django.db import models
- class Question(models.Model):
- text = models.TextField()
- # ...
- class Answer(models.Model):
- question = models.ForeignKey(Question, on_delete=models.CASCADE)
- # ...
- class Meta:
- order_with_respect_to = "question"
- When ``order_with_respect_to`` is set, two additional methods are provided to
- retrieve and to set the order of the related objects: ``get_RELATED_order()``
- and ``set_RELATED_order()``, where ``RELATED`` is the lowercased model name. For
- example, assuming that a ``Question`` object has multiple related ``Answer``
- objects, the list returned contains the primary keys of the related ``Answer``
- objects:
- .. code-block:: pycon
- >>> question = Question.objects.get(id=1)
- >>> question.get_answer_order()
- [1, 2, 3]
- The order of a ``Question`` object's related ``Answer`` objects can be set by
- passing in a list of ``Answer`` primary keys:
- .. code-block:: pycon
- >>> question.set_answer_order([3, 1, 2])
- The related objects also get two methods, ``get_next_in_order()`` and
- ``get_previous_in_order()``, which can be used to access those objects in their
- proper order. Assuming the ``Answer`` objects are ordered by ``id``:
- .. code-block:: pycon
- >>> answer = Answer.objects.get(id=2)
- >>> answer.get_next_in_order()
- <Answer: 3>
- >>> answer.get_previous_in_order()
- <Answer: 1>
- .. admonition:: ``order_with_respect_to`` implicitly sets the ``ordering`` option
- Internally, ``order_with_respect_to`` adds an additional field/database
- column named ``_order`` and sets the model's :attr:`~Options.ordering`
- option to this field. Consequently, ``order_with_respect_to`` and
- ``ordering`` cannot be used together, and the ordering added by
- ``order_with_respect_to`` will apply whenever you obtain a list of objects
- of this model.
- .. admonition:: Changing ``order_with_respect_to``
- Because ``order_with_respect_to`` adds a new database column, be sure to
- make and apply the appropriate migrations if you add or change
- ``order_with_respect_to`` after your initial :djadmin:`migrate`.
- ``ordering``
- ------------
- .. attribute:: Options.ordering
- The default ordering for the object, for use when obtaining lists of objects::
- ordering = ["-order_date"]
- This is a tuple or list of strings and/or query expressions. Each string is
- a field name with an optional "-" prefix, which indicates descending order.
- Fields without a leading "-" will be ordered ascending. Use the string "?"
- to order randomly.
- For example, to order by a ``pub_date`` field ascending, use this::
- ordering = ["pub_date"]
- To order by ``pub_date`` descending, use this::
- ordering = ["-pub_date"]
- To order by ``pub_date`` descending, then by ``author`` ascending, use this::
- ordering = ["-pub_date", "author"]
- You can also use :doc:`query expressions </ref/models/expressions>`. To
- order by ``author`` ascending and make null values sort last, use this::
- from django.db.models import F
- ordering = [F("author").asc(nulls_last=True)]
- .. warning::
- Ordering is not a free operation. Each field you add to the ordering
- incurs a cost to your database. Each foreign key you add will
- implicitly include all of its default orderings as well.
- If a query doesn't have an ordering specified, results are returned from
- the database in an unspecified order. A particular ordering is guaranteed
- only when ordering by a set of fields that uniquely identify each object in
- the results. For example, if a ``name`` field isn't unique, ordering by it
- won't guarantee objects with the same name always appear in the same order.
- ``permissions``
- ---------------
- .. attribute:: Options.permissions
- Extra permissions to enter into the permissions table when creating this object.
- Add, change, delete, and view permissions are automatically created for each
- model. This example specifies an extra permission, ``can_deliver_pizzas``::
- permissions = [("can_deliver_pizzas", "Can deliver pizzas")]
- This is a list or tuple of 2-tuples in the format ``(permission_code,
- human_readable_permission_name)``.
- ``default_permissions``
- -----------------------
- .. attribute:: Options.default_permissions
- Defaults to ``('add', 'change', 'delete', 'view')``. You may customize this
- list, for example, by setting this to an empty list if your app doesn't
- require any of the default permissions. It must be specified on the model
- before the model is created by :djadmin:`migrate` in order to prevent any
- omitted permissions from being created.
- ``proxy``
- ---------
- .. attribute:: Options.proxy
- If ``proxy = True``, a model which subclasses another model will be treated as
- a :ref:`proxy model <proxy-models>`.
- ``required_db_features``
- ------------------------
- .. attribute:: Options.required_db_features
- List of database features that the current connection should have so that
- the model is considered during the migration phase. For example, if you set
- this list to ``['gis_enabled']``, the model will only be synchronized on
- GIS-enabled databases. It's also useful to skip some models when testing
- with several database backends. Avoid relations between models that may or
- may not be created as the ORM doesn't handle this.
- ``required_db_vendor``
- ----------------------
- .. attribute:: Options.required_db_vendor
- Name of a supported database vendor that this model is specific to. Current
- built-in vendor names are: ``sqlite``, ``postgresql``, ``mysql``,
- ``oracle``. If this attribute is not empty and the current connection vendor
- doesn't match it, the model will not be synchronized.
- ``select_on_save``
- ------------------
- .. attribute:: Options.select_on_save
- Determines if Django will use the pre-1.6
- :meth:`django.db.models.Model.save()` algorithm. The old algorithm
- uses ``SELECT`` to determine if there is an existing row to be updated.
- The new algorithm tries an ``UPDATE`` directly. In some rare cases the
- ``UPDATE`` of an existing row isn't visible to Django. An example is the
- PostgreSQL ``ON UPDATE`` trigger which returns ``NULL``. In such cases the
- new algorithm will end up doing an ``INSERT`` even when a row exists in
- the database.
- Usually there is no need to set this attribute. The default is
- ``False``.
- See :meth:`django.db.models.Model.save()` for more about the old and
- new saving algorithm.
- ``indexes``
- -----------
- .. attribute:: Options.indexes
- A list of :doc:`indexes </ref/models/indexes>` that you want to define on
- the model::
- from django.db import models
- class Customer(models.Model):
- first_name = models.CharField(max_length=100)
- last_name = models.CharField(max_length=100)
- class Meta:
- indexes = [
- models.Index(fields=["last_name", "first_name"]),
- models.Index(fields=["first_name"], name="first_name_idx"),
- ]
- ``unique_together``
- -------------------
- .. attribute:: Options.unique_together
- .. admonition:: Use :class:`.UniqueConstraint` with the :attr:`~Options.constraints` option instead.
- :class:`.UniqueConstraint` provides more functionality than
- ``unique_together``. ``unique_together`` may be deprecated in the
- future.
- Sets of field names that, taken together, must be unique::
- unique_together = [["driver", "restaurant"]]
- This is a list of lists that must be unique when considered together.
- It's used in the Django admin and is enforced at the database level (i.e., the
- appropriate ``UNIQUE`` statements are included in the ``CREATE TABLE``
- statement).
- For convenience, ``unique_together`` can be a single list when dealing with
- a single set of fields::
- unique_together = ["driver", "restaurant"]
- A :class:`~django.db.models.ManyToManyField` cannot be included in
- ``unique_together``. (It's not clear what that would even mean!) If you
- need to validate uniqueness related to a
- :class:`~django.db.models.ManyToManyField`, try using a signal or
- an explicit :attr:`through <ManyToManyField.through>` model.
- The ``ValidationError`` raised during model validation when the constraint
- is violated has the ``unique_together`` error code.
- ``constraints``
- ---------------
- .. attribute:: Options.constraints
- A list of :doc:`constraints </ref/models/constraints>` that you want to
- define on the model::
- from django.db import models
- class Customer(models.Model):
- age = models.IntegerField()
- class Meta:
- constraints = [
- models.CheckConstraint(condition=models.Q(age__gte=18), name="age_gte_18"),
- ]
- ``verbose_name``
- ----------------
- .. attribute:: Options.verbose_name
- A human-readable name for the object, singular::
- verbose_name = "pizza"
- If this isn't given, Django will use a munged version of the class name:
- ``CamelCase`` becomes ``camel case``.
- ``verbose_name_plural``
- -----------------------
- .. attribute:: Options.verbose_name_plural
- The plural name for the object::
- verbose_name_plural = "stories"
- If this isn't given, Django will use :attr:`~Options.verbose_name` + ``"s"``.
- Read-only ``Meta`` attributes
- =============================
- ``label``
- ---------
- .. attribute:: Options.label
- Representation of the object, returns ``app_label.object_name``, e.g.
- ``'polls.Question'``.
- ``label_lower``
- ---------------
- .. attribute:: Options.label_lower
- Representation of the model, returns ``app_label.model_name``, e.g.
- ``'polls.question'``.
|