diff options
| author | Jorge C. Leitão <jorgecarleitao@gmail.com> | 2014-06-23 08:33:42 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2014-07-10 06:03:04 -0400 |
| commit | e1fa7dffdc1b141cb858160890d448ca778366e4 (patch) | |
| tree | 6ea78870c8ae06159aaeb7b1b0daa9dfc5ebf08e /docs/ref/models | |
| parent | b02abd688a60e2dedf607e34d2cc97aca8d1c2b5 (diff) | |
Fixed #22809 -- Added model Field API reference.
Thanks to @timgraham for the review.
Diffstat (limited to 'docs/ref/models')
| -rw-r--r-- | docs/ref/models/fields.txt | 192 |
1 files changed, 190 insertions, 2 deletions
diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt index 3a64ad934a..9c585053a9 100644 --- a/docs/ref/models/fields.txt +++ b/docs/ref/models/fields.txt @@ -7,8 +7,8 @@ Model field reference .. currentmodule:: django.db.models -This document contains all the gory details about all the `field options`_ and -`field types`_ Django's got to offer. +This document contains all the API references of :class:`Field` including the +`field options`_ and `field types`_ Django offers. .. seealso:: @@ -1519,3 +1519,191 @@ accepted by :class:`ForeignKey`, plus one extra argument: See :doc:`One-to-one relationships </topics/db/examples/one_to_one>` for usage examples of ``OneToOneField``. + +Field API reference +=================== + +.. class:: Field + + ``Field`` is an abstract class that represents a database table column. + Django uses fields to create the database table (:meth:`db_type`), to map + Python types to database (:meth:`get_prep_value`) and vice-versa + (:meth:`to_python`), and to apply :doc:`/ref/models/lookups` + (:meth:`get_prep_lookup`). + + A field is thus a fundamental piece in different Django APIs, notably, + :class:`models <django.db.models.Model>` and :class:`querysets + <django.db.models.query.QuerySet>`. + + In models, a field is instantiated as a class attribute and represents a + particular table column, see :doc:`/topics/db/models`. It has attributes + such as :attr:`null` and :attr:`unique`, and methods that Django uses to + map the field value to database-specific values. + + A ``Field`` is a subclass of + :class:`~django.db.models.lookups.RegisterLookupMixin` and thus both + :class:`~django.db.models.Transform` and + :class:`~django.db.models.Lookup` can be registered on it to be used + in ``QuerySet``\s (e.g. ``field_name__exact="foo"``). All :ref:`built-in + lookups <field-lookups>` are registered by default. + + All of Django's built-in fields, such as :class:`CharField`, are particular + implementations of ``Field``. If you need a custom field, you can either + subclass any of the built-in fields or write a ``Field``` from scratch. In + either case, see :doc:`/howto/custom-model-fields`. + + .. attribute:: description + + A verbose description of the field, e.g. for the + :mod:`django.contrib.admindocs` application. + + The description can be of the form:: + + description = _("String (up to %(max_length)s)") + + where the arguments are interpolated from the field's ``__dict__``. + + To map a ``Field`` to a database-specific type, Django exposes two methods: + + .. method:: get_internal_type() + + Returns a string naming this field for backend specific purposes. + By default, it returns the class name. + + See :ref:`emulating-built-in-field-types` for usage in custom fields. + + .. method:: db_type(connection) + + Returns the database column data type for the :class:`Field`, taking + into account the ``connection``. + + See :ref:`custom-database-types` for usage in custom fields. + + There are three main situations where Django needs to interact with the + database backend and fields: + + * when it queries the database (Python value -> database backend value) + * when it loads data from the database (database backend value -> Python + value) + * when it saves to the database (Python value -> database backend value) + + When querying, :meth:`get_db_prep_value` and :meth:`get_prep_value` are used: + + .. method:: get_prep_value(value) + + ``value`` is the current value of the model's attribute, and the method + should return data in a format that has been prepared for use as a + parameter in a query. + + See :ref:`converting-python-objects-to-query-values` for usage. + + .. method:: get_db_prep_value(value, connection, prepared=False) + + Converts ``value`` to a backend-specific value. By default it returns + ``value`` if ``prepared=True`` and :meth:`~Field.get_prep_value` if is + ``False``. + + See :ref:`converting-query-values-to-database-values` for usage. + + When loading data, :meth:`to_python` is used: + + .. method:: to_python(value) + + Converts a value as returned by the database (or a serializer) to a + Python object. It is the reverse of :meth:`get_prep_value`. + + The default implementation returns ``value``, which is the common case + when the database backend already returns the correct Python type. + + See :ref:`converting-database-values-to-python-objects` for usage. + + When saving, :meth:`pre_save` and :meth:`get_db_prep_save` are used: + + .. method:: get_db_prep_save(value, connection) + + Same as the :meth:`get_db_prep_value`, but called when the field value + must be *saved* to the database. By default returns + :meth:`get_db_prep_value`. + + .. method:: pre_save(model_instance, add) + + Method called prior to :meth:`get_db_prep_save` to prepare the value + before being saved (e.g. for :attr:`DateField.auto_now`). + + ``model_instance`` is the instance this field belongs to and ``add`` + is whether the instance is being saved to the database for the first + time. + + It should return the value of the appropriate attribute from + ``model_instance`` for this field. The attribute name is in + ``self.attname`` (this is set up by :class:`~django.db.models.Field`). + + See :ref:`preprocessing-values-before-saving` for usage. + + Besides saving to the database, the field also needs to know how to + serialize its value (inverse of :meth:`to_python`): + + .. method:: value_to_string(obj) + + Converts ``obj`` to a string. Used to serialize the value of the field. + + See :ref:`converting-model-field-to-serialization` for usage. + + When a lookup is used on a field, the value may need to be "prepared". + Django exposes two methods for this: + + .. method:: get_prep_lookup(lookup_type, value) + + Prepares ``value`` to the database prior to be used in a lookup. + The ``lookup_type`` will be one of the valid Django filter lookups: + ``"exact"``, ``"iexact"``, ``"contains"``, ``"icontains"``, + ``"gt"``, ``"gte"``, ``"lt"``, ``"lte"``, ``"in"``, ``"startswith"``, + ``"istartswith"``, ``"endswith"``, ``"iendswith"``, ``"range"``, + ``"year"``, ``"month"``, ``"day"``, ``"isnull"``, ``"search"``, + ``"regex"``, and ``"iregex"``. + + .. versionadded:: 1.7 + + If you are using :doc:`Custom lookups </ref/models/lookups>` the + ``lookup_type`` can be any ``lookup_name`` registered in the field. + + See :ref:`preparing-values-for-use-in-database-lookups` for usage. + + .. method:: get_db_prep_lookup(lookup_type, value, connection, prepared=False) + + Similar to :meth:`get_db_prep_value`, but for performing a lookup. + + As with :meth:`get_db_prep_value`, the specific connection that will + be used for the query is passed as ``connection``. In addition, + ``prepared`` describes whether the value has already been prepared with + :meth:`get_prep_lookup`. + + When using :class:`model forms <django.forms.ModelForm>`, the ``Field`` + needs to know which form field it should be represented by: + + .. method:: formfield(form_class=None, choices_form_class=None, **kwargs) + + Returns the default :class:`django.forms.Field` of this field for + :class:`~django.forms.ModelForm`. + + By default, if both ``form_class`` and ``choices_form_class`` are + ``None``, it uses :class:`~django.forms.CharField`; if + ``choices_form_class`` is given, it returns + :class:`~django.forms.TypedChoiceField`. + + See :ref:`specifying-form-field-for-model-field` for usage. + + .. method:: deconstruct() + + .. versionadded:: 1.7 + + Returns a 4-tuple with enough information to recreate the field: + + 1. The name of the field on the model. + 2. The import path of the field (e.g. ``"django.db.models.IntegerField"``). + This should be the most portable version, so less specific may be better. + 3. A list of positional arguments. + 4. A dict of keyword arguments. + + This method must be added to fields prior to 1.7 to migrate its data + using :doc:`/topics/migrations`. |
