1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330 |
- =====================
- Model field reference
- =====================
- .. module:: django.db.models.fields
- :synopsis: Built-in field types.
- .. currentmodule:: django.db.models
- This document contains all the gory details about all the `field options`_ and
- `field types`_ Django's got to offer.
- .. seealso::
- If the built-in fields don't do the trick, you can try :doc:`localflavor
- </topics/localflavor>`, which contains assorted pieces of code
- that are useful for particular countries or cultures. Also, you can easily
- :doc:`write your own custom model fields </howto/custom-model-fields>`.
- .. note::
- Technically, these models are defined in :mod:`django.db.models.fields`, but
- for convenience they're imported into :mod:`django.db.models`; the standard
- convention is to use ``from django.db import models`` and refer to fields as
- ``models.<Foo>Field``.
- .. _common-model-field-options:
- Field options
- =============
- The following arguments are available to all field types. All are optional.
- ``null``
- --------
- .. attribute:: Field.null
- If ``True``, Django will store empty values as ``NULL`` in the database. Default
- is ``False``.
- Note that empty string values will always get stored as empty strings, not as
- ``NULL``. Only use ``null=True`` for non-string fields such as integers,
- booleans and dates. For both types of fields, you will also need to set
- ``blank=True`` if you wish to permit empty values in forms, as the
- :attr:`~Field.null` parameter only affects database storage (see
- :attr:`~Field.blank`).
- Avoid using :attr:`~Field.null` on string-based fields such as
- :class:`CharField` and :class:`TextField` unless you have an excellent reason.
- If a string-based field has ``null=True``, that means it has two possible values
- for "no data": ``NULL``, and the empty string. In most cases, it's redundant to
- have two possible values for "no data;" Django convention is to use the empty
- string, not ``NULL``.
- .. note::
- When using the Oracle database backend, the value ``NULL`` will be stored to
- denote the empty string regardless of this attribute.
- If you want to accept :attr:`~Field.null` values with :class:`BooleanField`,
- use :class:`NullBooleanField` instead.
- ``blank``
- ---------
- .. attribute:: Field.blank
- If ``True``, the field is allowed to be blank. Default is ``False``.
- Note that this is different than :attr:`~Field.null`. :attr:`~Field.null` is
- purely database-related, whereas :attr:`~Field.blank` is validation-related. If
- a field has ``blank=True``, form validation will allow entry of an empty value.
- If a field has ``blank=False``, the field will be required.
- .. _field-choices:
- ``choices``
- -----------
- .. attribute:: Field.choices
- An iterable (e.g., a list or tuple) consisting itself of iterables of exactly
- two items (e.g. ``[(A, B), (A, B) ...]``) to use as choices for this field. If
- this is given, the default form widget will be a select box with these choices
- instead of the standard text field.
- The first element in each tuple is the actual value to be stored, and the
- second element is the human-readable name. For example::
- YEAR_IN_SCHOOL_CHOICES = (
- ('FR', 'Freshman'),
- ('SO', 'Sophomore'),
- ('JR', 'Junior'),
- ('SR', 'Senior'),
- )
- Generally, it's best to define choices inside a model class, and to
- define a suitably-named constant for each value::
- from django.db import models
- class Student(models.Model):
- FRESHMAN = 'FR'
- SOPHOMORE = 'SO'
- JUNIOR = 'JR'
- SENIOR = 'SR'
- YEAR_IN_SCHOOL_CHOICES = (
- (FRESHMAN, 'Freshman'),
- (SOPHOMORE, 'Sophomore'),
- (JUNIOR, 'Junior'),
- (SENIOR, 'Senior'),
- )
- year_in_school = models.CharField(max_length=2,
- choices=YEAR_IN_SCHOOL_CHOICES,
- default=FRESHMAN)
- def is_upperclass(self):
- return self.year_in_school in (self.JUNIOR, self.SENIOR)
- Though you can define a choices list outside of a model class and then
- refer to it, defining the choices and names for each choice inside the
- model class keeps all of that information with the class that uses it,
- and makes the choices easy to reference (e.g, ``Student.SOPHOMORE``
- will work anywhere that the ``Student`` model has been imported).
- You can also collect your available choices into named groups that can
- be used for organizational purposes::
- MEDIA_CHOICES = (
- ('Audio', (
- ('vinyl', 'Vinyl'),
- ('cd', 'CD'),
- )
- ),
- ('Video', (
- ('vhs', 'VHS Tape'),
- ('dvd', 'DVD'),
- )
- ),
- ('unknown', 'Unknown'),
- )
- The first element in each tuple is the name to apply to the group. The
- second element is an iterable of 2-tuples, with each 2-tuple containing
- a value and a human-readable name for an option. Grouped options may be
- combined with ungrouped options within a single list (such as the
- `unknown` option in this example).
- For each model field that has :attr:`~Field.choices` set, Django will add a
- method to retrieve the human-readable name for the field's current value. See
- :meth:`~django.db.models.Model.get_FOO_display` in the database API
- documentation.
- Note that choices can be any iterable object -- not necessarily a list or tuple.
- This lets you construct choices dynamically. But if you find yourself hacking
- :attr:`~Field.choices` to be dynamic, you're probably better off using a proper
- database table with a :class:`ForeignKey`. :attr:`~Field.choices` is meant for
- static data that doesn't change much, if ever.
- .. versionadded:: 1.7
- Unless :attr:`blank=False<Field.blank>` is set on the field along with a
- :attr:`~Field.default` then a label containing ``"---------"`` will be rendered
- with the select box. To override this behavior, add a tuple to ``choices``
- containing ``None``; e.g. ``(None, 'Your String For Display')``.
- Alternatively, you can use an empty string instead of ``None`` where this makes
- sense - such as on a :class:`~django.db.models.CharField`.
- ``db_column``
- -------------
- .. attribute:: Field.db_column
- The name of the database column to use for this field. If this isn't given,
- Django will use the field's name.
- If your database column 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.
- ``db_index``
- ------------
- .. attribute:: Field.db_index
- If ``True``, :djadmin:`django-admin.py sqlindexes <sqlindexes>` will output a
- ``CREATE INDEX`` statement for this field.
- ``db_tablespace``
- -----------------
- .. attribute:: Field.db_tablespace
- The name of the :doc:`database tablespace </topics/db/tablespaces>` to use for
- this field's index, if this field is indexed. The default is the project's
- :setting:`DEFAULT_INDEX_TABLESPACE` setting, if set, or the
- :attr:`~Options.db_tablespace` of the model, if any. If the backend doesn't
- support tablespaces for indexes, this option is ignored.
- ``default``
- -----------
- .. attribute:: Field.default
- The default value for the field. This can be a value or a callable object. If
- callable it will be called every time a new object is created.
- The default cannot be a mutable object (model instance, list, set, etc.), as a
- reference to the same instance of that object would be used as the default
- value in all new model instances. Instead, wrap the desired default in a
- callable. For example, if you had a custom ``JSONField`` and wanted to specify
- a dictionary as the default, use a ``lambda`` as follows::
- contact_info = JSONField("ContactInfo", default=lambda:{"email": "to1@example.com"})
- ``editable``
- ------------
- .. attribute:: Field.editable
- If ``False``, the field will not be displayed in the admin or any other
- :class:`~django.forms.ModelForm`. Default is ``True``.
- ``error_messages``
- ------------------
- .. attribute:: Field.error_messages
- The ``error_messages`` argument lets you override the default messages that the
- field will raise. Pass in a dictionary with keys matching the error messages you
- want to override.
- Error message keys include ``null``, ``blank``, ``invalid``, ``invalid_choice``,
- and ``unique``. Additional error message keys are specified for each field in
- the `Field types`_ section below.
- ``help_text``
- -------------
- .. attribute:: Field.help_text
- Extra "help" text to be displayed with the form widget. It's useful for
- documentation even if your field isn't used on a form.
- Note that this value is *not* HTML-escaped in automatically-generated
- forms. This lets you include HTML in :attr:`~Field.help_text` if you so
- desire. For example::
- help_text="Please use the following format: <em>YYYY-MM-DD</em>."
- Alternatively you can use plain text and
- ``django.utils.html.escape()`` to escape any HTML special characters.
- ``primary_key``
- ---------------
- .. attribute:: Field.primary_key
- If ``True``, this field is the primary key for the model.
- If you don't specify ``primary_key=True`` for any field in your model, Django
- will automatically add an :class:`AutoField` to hold the primary key, so you
- don't need to set ``primary_key=True`` on any of your fields unless you want to
- override the default primary-key behavior. For more, see
- :ref:`automatic-primary-key-fields`.
- ``primary_key=True`` implies :attr:`null=False <Field.null>` and :attr:`unique=True <Field.unique>`.
- Only one primary key is allowed on an object.
- ``unique``
- ----------
- .. attribute:: Field.unique
- If ``True``, this field must be unique throughout the table.
- This is enforced at the database level and by model validation. If
- you try to save a model with a duplicate value in a :attr:`~Field.unique`
- field, a :exc:`django.db.IntegrityError` will be raised by the model's
- :meth:`~django.db.models.Model.save` method.
- This option is valid on all field types except :class:`ManyToManyField`,
- :class:`OneToOneField`, and :class:`FileField`.
- Note that when ``unique`` is ``True``, you don't need to specify
- :attr:`~Field.db_index`, because ``unique`` implies the creation of an index.
- ``unique_for_date``
- -------------------
- .. attribute:: Field.unique_for_date
- Set this to the name of a :class:`DateField` or :class:`DateTimeField` to
- require that this field be unique for the value of the date field.
- For example, if you have a field ``title`` that has
- ``unique_for_date="pub_date"``, then Django wouldn't allow the entry of two
- records with the same ``title`` and ``pub_date``.
- Note that if you set this to point to a :class:`DateTimeField`, only the date
- portion of the field will be considered.
- This is enforced by :meth:`Model.validate_unique()` during model validation
- but not at the database level. If any :attr:`~Field.unique_for_date` constraint
- involves fields that are not part of a :class:`~django.forms.ModelForm` (for
- example, if one of the fields is listed in ``exclude`` or has
- :attr:`editable=False<Field.editable>`), :meth:`Model.validate_unique()` will
- skip validation for that particular constraint.
- ``unique_for_month``
- --------------------
- .. attribute:: Field.unique_for_month
- Like :attr:`~Field.unique_for_date`, but requires the field to be unique with
- respect to the month.
- ``unique_for_year``
- -------------------
- .. attribute:: Field.unique_for_year
- Like :attr:`~Field.unique_for_date` and :attr:`~Field.unique_for_month`.
- ``verbose_name``
- -------------------
- .. attribute:: Field.verbose_name
- A human-readable name for the field. If the verbose name isn't given, Django
- will automatically create it using the field's attribute name, converting
- underscores to spaces. See :ref:`Verbose field names <verbose-field-names>`.
- ``validators``
- -------------------
- .. attribute:: Field.validators
- A list of validators to run for this field. See the :doc:`validators
- documentation </ref/validators>` for more information.
- .. _model-field-types:
- Field types
- ===========
- .. currentmodule:: django.db.models
- ``AutoField``
- -------------
- .. class:: AutoField(**options)
- An :class:`IntegerField` that automatically increments
- according to available IDs. You usually won't need to use this directly; a
- primary key field will automatically be added to your model if you don't specify
- otherwise. See :ref:`automatic-primary-key-fields`.
- ``BigIntegerField``
- -------------------
- .. class:: BigIntegerField([**options])
- A 64 bit integer, much like an :class:`IntegerField` except that it is
- guaranteed to fit numbers from -9223372036854775808 to 9223372036854775807. The
- default form widget for this field is a :class:`~django.forms.TextInput`.
- ``BinaryField``
- -------------------
- .. class:: BinaryField([**options])
- .. versionadded:: 1.6
- A field to store raw binary data. It only supports ``bytes`` assignment. Be
- aware that this field has limited functionality. For example, it is not possible
- to filter a queryset on a ``BinaryField`` value.
- .. admonition:: Abusing ``BinaryField``
- Although you might think about storing files in the database, consider that
- it is bad design in 99% of the cases. This field is *not* a replacement for
- proper :doc:`static files </howto/static-files/index>` handling.
- ``BooleanField``
- ----------------
- .. class:: BooleanField(**options)
- A true/false field.
- The default form widget for this field is a
- :class:`~django.forms.CheckboxInput`.
- If you need to accept :attr:`~Field.null` values then use
- :class:`NullBooleanField` instead.
- .. versionchanged:: 1.6
- The default value of ``BooleanField`` was changed from ``False`` to
- ``None`` when :attr:`Field.default` isn't defined.
- ``CharField``
- -------------
- .. class:: CharField(max_length=None, [**options])
- A string field, for small- to large-sized strings.
- For large amounts of text, use :class:`~django.db.models.TextField`.
- The default form widget for this field is a :class:`~django.forms.TextInput`.
- :class:`CharField` has one extra required argument:
- .. attribute:: CharField.max_length
- The maximum length (in characters) of the field. The max_length is enforced
- at the database level and in Django's validation.
- .. note::
- If you are writing an application that must be portable to multiple
- database backends, you should be aware that there are restrictions on
- ``max_length`` for some backends. Refer to the :doc:`database backend
- notes </ref/databases>` for details.
- .. admonition:: MySQL users
- If you are using this field with MySQLdb 1.2.2 and the ``utf8_bin``
- collation (which is *not* the default), there are some issues to be aware
- of. Refer to the :ref:`MySQL database notes <mysql-collation>` for
- details.
- ``CommaSeparatedIntegerField``
- ------------------------------
- .. class:: CommaSeparatedIntegerField(max_length=None, [**options])
- A field of integers separated by commas. As in :class:`CharField`, the
- :attr:`~CharField.max_length` argument is required and the note about database
- portability mentioned there should be heeded.
- ``DateField``
- -------------
- .. class:: DateField([auto_now=False, auto_now_add=False, **options])
- A date, represented in Python by a ``datetime.date`` instance. Has a few extra,
- optional arguments:
- .. attribute:: DateField.auto_now
- Automatically set the field to now every time the object is saved. Useful
- for "last-modified" timestamps. Note that the current date is *always*
- used; it's not just a default value that you can override.
- .. attribute:: DateField.auto_now_add
- Automatically set the field to now when the object is first created. Useful
- for creation of timestamps. Note that the current date is *always* used;
- it's not just a default value that you can override.
- The default form widget for this field is a
- :class:`~django.forms.TextInput`. The admin adds a JavaScript calendar,
- and a shortcut for "Today". Includes an additional ``invalid_date`` error
- message key.
- .. note::
- As currently implemented, setting ``auto_now`` or ``auto_now_add`` to
- ``True`` will cause the field to have ``editable=False`` and ``blank=True``
- set.
- ``DateTimeField``
- -----------------
- .. class:: DateTimeField([auto_now=False, auto_now_add=False, **options])
- A date and time, represented in Python by a ``datetime.datetime`` instance.
- Takes the same extra arguments as :class:`DateField`.
- The default form widget for this field is a single
- :class:`~django.forms.TextInput`. The admin uses two separate
- :class:`~django.forms.TextInput` widgets with JavaScript shortcuts.
- ``DecimalField``
- ----------------
- .. class:: DecimalField(max_digits=None, decimal_places=None, [**options])
- A fixed-precision decimal number, represented in Python by a
- :class:`~decimal.Decimal` instance. Has two **required** arguments:
- .. attribute:: DecimalField.max_digits
- The maximum number of digits allowed in the number. Note that this number
- must be greater than or equal to ``decimal_places``.
- .. attribute:: DecimalField.decimal_places
- The number of decimal places to store with the number.
- For example, to store numbers up to 999 with a resolution of 2 decimal places,
- you'd use::
- models.DecimalField(..., max_digits=5, decimal_places=2)
- And to store numbers up to approximately one billion with a resolution of 10
- decimal places::
- models.DecimalField(..., max_digits=19, decimal_places=10)
- The default form widget for this field is a :class:`~django.forms.TextInput`.
- .. note::
- For more information about the differences between the
- :class:`FloatField` and :class:`DecimalField` classes, please
- see :ref:`FloatField vs. DecimalField <floatfield_vs_decimalfield>`.
- ``EmailField``
- --------------
- .. class:: EmailField([max_length=75, **options])
- A :class:`CharField` that checks that the value is a valid email address.
- .. admonition:: Incompliance to RFCs
- The default 75 character ``max_length`` is not capable of storing all
- possible RFC3696/5321-compliant email addresses. In order to store all
- possible valid email addresses, a ``max_length`` of 254 is required.
- The default ``max_length`` of 75 exists for historical reasons. The
- default has not been changed in order to maintain backwards
- compatibility with existing uses of :class:`EmailField`.
- ``FileField``
- -------------
- .. class:: FileField(upload_to=None, [max_length=100, **options])
- A file-upload field.
- .. note::
- The ``primary_key`` and ``unique`` arguments are not supported, and will
- raise a ``TypeError`` if used.
- Has one **required** argument:
- .. attribute:: FileField.upload_to
- A local filesystem path that will be appended to your :setting:`MEDIA_ROOT`
- setting to determine the value of the
- :attr:`~django.db.models.fields.files.FieldFile.url` attribute.
- This path may contain :func:`~time.strftime` formatting, which will be
- replaced by the date/time of the file upload (so that uploaded files don't
- fill up the given directory).
- This may also be a callable, such as a function, which will be called to
- obtain the upload path, including the filename. This callable must be able
- to accept two arguments, and return a Unix-style path (with forward slashes)
- to be passed along to the storage system. The two arguments that will be
- passed are:
- ====================== ===============================================
- Argument Description
- ====================== ===============================================
- ``instance`` An instance of the model where the
- ``FileField`` is defined. More specifically,
- this is the particular instance where the
- current file is being attached.
- In most cases, this object will not have been
- saved to the database yet, so if it uses the
- default ``AutoField``, *it might not yet have a
- value for its primary key field*.
- ``filename`` The filename that was originally given to the
- file. This may or may not be taken into account
- when determining the final destination path.
- ====================== ===============================================
- Also has one optional argument:
- .. attribute:: FileField.storage
- Optional. A storage object, which handles the storage and retrieval of your
- files. See :doc:`/topics/files` for details on how to provide this object.
- The default form widget for this field is a :class:`~django.forms.FileInput`.
- Using a :class:`FileField` or an :class:`ImageField` (see below) in a model
- takes a few steps:
- 1. In your settings file, you'll need to define :setting:`MEDIA_ROOT` as the
- full path to a directory where you'd like Django to store uploaded files.
- (For performance, these files are not stored in the database.) Define
- :setting:`MEDIA_URL` as the base public URL of that directory. Make sure
- that this directory is writable by the Web server's user account.
- 2. Add the :class:`FileField` or :class:`ImageField` to your model, making
- sure to define the :attr:`~FileField.upload_to` option to tell Django
- to which subdirectory of :setting:`MEDIA_ROOT` it should upload files.
- 3. All that will be stored in your database is a path to the file
- (relative to :setting:`MEDIA_ROOT`). You'll most likely want to use the
- convenience :attr:`~django.db.models.fields.files.FieldFile.url` attribute
- provided by Django. For example, if your :class:`ImageField` is called
- ``mug_shot``, you can get the absolute path to your image in a template with
- ``{{ object.mug_shot.url }}``.
- For example, say your :setting:`MEDIA_ROOT` is set to ``'/home/media'``, and
- :attr:`~FileField.upload_to` is set to ``'photos/%Y/%m/%d'``. The ``'%Y/%m/%d'``
- part of :attr:`~FileField.upload_to` is :func:`~time.strftime` formatting;
- ``'%Y'`` is the four-digit year, ``'%m'`` is the two-digit month and ``'%d'`` is
- the two-digit day. If you upload a file on Jan. 15, 2007, it will be saved in
- the directory ``/home/media/photos/2007/01/15``.
- If you wanted to retrieve the uploaded file's on-disk filename, or the file's
- size, you could use the :attr:`~django.core.files.File.name` and
- :attr:`~django.core.files.File.size` attributes respectively; for more
- information on the available attributes and methods, see the
- :class:`~django.core.files.File` class reference and the :doc:`/topics/files`
- topic guide.
- .. note::
- The file is saved as part of saving the model in the database, so the actual
- file name used on disk cannot be relied on until after the model has been
- saved.
- The uploaded file's relative URL can be obtained using the
- :attr:`~django.db.models.fields.files.FieldFile.url` attribute. Internally,
- this calls the :meth:`~django.core.files.storage.Storage.url` method of the
- underlying :class:`~django.core.files.storage.Storage` class.
- .. _file-upload-security:
- Note that whenever you deal with uploaded files, you should pay close attention
- to where you're uploading them and what type of files they are, to avoid
- security holes. *Validate all uploaded files* so that you're sure the files are
- what you think they are. For example, if you blindly let somebody upload files,
- without validation, to a directory that's within your Web server's document
- root, then somebody could upload a CGI or PHP script and execute that script by
- visiting its URL on your site. Don't allow that.
- Also note that even an uploaded HTML file, since it can be executed by the
- browser (though not by the server), can pose security threats that are
- equivalent to XSS or CSRF attacks.
- By default, :class:`FileField` instances are
- created as ``varchar(100)`` columns in your database. As with other fields, you
- can change the maximum length using the :attr:`~CharField.max_length` argument.
- FileField and FieldFile
- ~~~~~~~~~~~~~~~~~~~~~~~
- .. currentmodule:: django.db.models.fields.files
- .. class:: FieldFile
- When you access a :class:`~django.db.models.FileField` on a model, you are
- given an instance of :class:`FieldFile` as a proxy for accessing the underlying
- file. This class has several attributes and methods that can be used to
- interact with file data:
- .. attribute:: FieldFile.url
- A read-only property to access the file's relative URL by calling the
- :meth:`~django.core.files.storage.Storage.url` method of the underlying
- :class:`~django.core.files.storage.Storage` class.
- .. method:: FieldFile.open(mode='rb')
- Behaves like the standard Python ``open()`` method and opens the file
- associated with this instance in the mode specified by ``mode``.
- .. method:: FieldFile.close()
- Behaves like the standard Python ``file.close()`` method and closes the file
- associated with this instance.
- .. method:: FieldFile.save(name, content, save=True)
- This method takes a filename and file contents and passes them to the storage
- class for the field, then associates the stored file with the model field.
- If you want to manually associate file data with
- :class:`~django.db.models.FileField` instances on your model, the ``save()``
- method is used to persist that file data.
- Takes two required arguments: ``name`` which is the name of the file, and
- ``content`` which is an object containing the file's contents. The
- optional ``save`` argument controls whether or not the instance is
- saved after the file has been altered. Defaults to ``True``.
- Note that the ``content`` argument should be an instance of
- :class:`django.core.files.File`, not Python's built-in file object.
- You can construct a :class:`~django.core.files.File` from an existing
- Python file object like this::
- from django.core.files import File
- # Open an existing file using Python's built-in open()
- f = open('/tmp/hello.world')
- myfile = File(f)
- Or you can construct one from a Python string like this::
- from django.core.files.base import ContentFile
- myfile = ContentFile("hello world")
- For more information, see :doc:`/topics/files`.
- .. method:: FieldFile.delete(save=True)
- Deletes the file associated with this instance and clears all attributes on
- the field. Note: This method will close the file if it happens to be open when
- ``delete()`` is called.
- The optional ``save`` argument controls whether or not the instance is saved
- after the file has been deleted. Defaults to ``True``.
- Note that when a model is deleted, related files are not deleted. If you need
- to cleanup orphaned files, you'll need to handle it yourself (for instance,
- with a custom management command that can be run manually or scheduled to run
- periodically via e.g. cron).
- .. currentmodule:: django.db.models
- ``FilePathField``
- -----------------
- .. class:: FilePathField(path=None, [match=None, recursive=False, max_length=100, **options])
- A :class:`CharField` whose choices are limited to the filenames in a certain
- directory on the filesystem. Has three special arguments, of which the first is
- **required**:
- .. attribute:: FilePathField.path
- Required. The absolute filesystem path to a directory from which this
- :class:`FilePathField` should get its choices. Example: ``"/home/images"``.
- .. attribute:: FilePathField.match
- Optional. A regular expression, as a string, that :class:`FilePathField`
- will use to filter filenames. Note that the regex will be applied to the
- base filename, not the full path. Example: ``"foo.*\.txt$"``, which will
- match a file called ``foo23.txt`` but not ``bar.txt`` or ``foo23.png``.
- .. attribute:: FilePathField.recursive
- Optional. Either ``True`` or ``False``. Default is ``False``. Specifies
- whether all subdirectories of :attr:`~FilePathField.path` should be included
- .. attribute:: FilePathField.allow_files
- Optional. Either ``True`` or ``False``. Default is ``True``. Specifies
- whether files in the specified location should be included. Either this or
- :attr:`~FilePathField.allow_folders` must be ``True``.
- .. attribute:: FilePathField.allow_folders
- Optional. Either ``True`` or ``False``. Default is ``False``. Specifies
- whether folders in the specified location should be included. Either this
- or :attr:`~FilePathField.allow_files` must be ``True``.
- Of course, these arguments can be used together.
- The one potential gotcha is that :attr:`~FilePathField.match` applies to the
- base filename, not the full path. So, this example::
- FilePathField(path="/home/images", match="foo.*", recursive=True)
- ...will match ``/home/images/foo.png`` but not ``/home/images/foo/bar.png``
- because the :attr:`~FilePathField.match` applies to the base filename
- (``foo.png`` and ``bar.png``).
- By default, :class:`FilePathField` instances are
- created as ``varchar(100)`` columns in your database. As with other fields, you
- can change the maximum length using the :attr:`~CharField.max_length` argument.
- ``FloatField``
- --------------
- .. class:: FloatField([**options])
- A floating-point number represented in Python by a ``float`` instance.
- The default form widget for this field is a :class:`~django.forms.TextInput`.
- .. _floatfield_vs_decimalfield:
- .. admonition:: ``FloatField`` vs. ``DecimalField``
- The :class:`FloatField` class is sometimes mixed up with the
- :class:`DecimalField` class. Although they both represent real numbers, they
- represent those numbers differently. ``FloatField`` uses Python's ``float``
- type internally, while ``DecimalField`` uses Python's ``Decimal`` type. For
- information on the difference between the two, see Python's documentation
- for the :mod:`decimal` module.
- ``ImageField``
- --------------
- .. class:: ImageField(upload_to=None, [height_field=None, width_field=None, max_length=100, **options])
- Inherits all attributes and methods from :class:`FileField`, but also
- validates that the uploaded object is a valid image.
- In addition to the special attributes that are available for :class:`FileField`,
- an :class:`ImageField` also has ``height`` and ``width`` attributes.
- To facilitate querying on those attributes, :class:`ImageField` has two extra
- optional arguments:
- .. attribute:: ImageField.height_field
- Name of a model field which will be auto-populated with the height of the
- image each time the model instance is saved.
- .. attribute:: ImageField.width_field
- Name of a model field which will be auto-populated with the width of the
- image each time the model instance is saved.
- Requires the `Python Imaging Library`_.
- .. _Python Imaging Library: http://www.pythonware.com/products/pil/
- By default, :class:`ImageField` instances are created as ``varchar(100)``
- columns in your database. As with other fields, you can change the maximum
- length using the :attr:`~CharField.max_length` argument.
- ``IntegerField``
- ----------------
- .. class:: IntegerField([**options])
- An integer. The default form widget for this field is a
- :class:`~django.forms.TextInput`.
- ``IPAddressField``
- ------------------
- .. class:: IPAddressField([**options])
- An IP address, in string format (e.g. "192.0.2.30"). The default form widget
- for this field is a :class:`~django.forms.TextInput`.
- ``GenericIPAddressField``
- -------------------------
- .. class:: GenericIPAddressField([protocol=both, unpack_ipv4=False, **options])
- An IPv4 or IPv6 address, in string format (e.g. ``192.0.2.30`` or
- ``2a02:42fe::4``). The default form widget for this field is a
- :class:`~django.forms.TextInput`.
- The IPv6 address normalization follows :rfc:`4291#section-2.2` section 2.2,
- including using the IPv4 format suggested in paragraph 3 of that section, like
- ``::ffff:192.0.2.0``. For example, ``2001:0::0:01`` would be normalized to
- ``2001::1``, and ``::ffff:0a0a:0a0a`` to ``::ffff:10.10.10.10``. All characters
- are converted to lowercase.
- .. attribute:: GenericIPAddressField.protocol
- Limits valid inputs to the specified protocol.
- Accepted values are ``'both'`` (default), ``'IPv4'``
- or ``'IPv6'``. Matching is case insensitive.
- .. attribute:: GenericIPAddressField.unpack_ipv4
- Unpacks IPv4 mapped addresses like ``::ffff:192.0.2.1``.
- If this option is enabled that address would be unpacked to
- ``192.0.2.1``. Default is disabled. Can only be used
- when ``protocol`` is set to ``'both'``.
- If you allow for blank values, you have to allow for null values since blank
- values are stored as null.
- ``NullBooleanField``
- --------------------
- .. class:: NullBooleanField([**options])
- Like a :class:`BooleanField`, but allows ``NULL`` as one of the options. Use
- this instead of a :class:`BooleanField` with ``null=True``. The default form
- widget for this field is a :class:`~django.forms.NullBooleanSelect`.
- ``PositiveIntegerField``
- ------------------------
- .. class:: PositiveIntegerField([**options])
- Like an :class:`IntegerField`, but must be either positive or zero (``0``).
- The value ``0`` is accepted for backward compatibility reasons.
- ``PositiveSmallIntegerField``
- -----------------------------
- .. class:: PositiveSmallIntegerField([**options])
- Like a :class:`PositiveIntegerField`, but only allows values under a certain
- (database-dependent) point. Values up to 32767 are safe in all databases
- supported by Django.
- ``SlugField``
- -------------
- .. class:: SlugField([max_length=50, **options])
- :term:`Slug` is a newspaper term. A slug is a short label for something,
- containing only letters, numbers, underscores or hyphens. They're generally used
- in URLs.
- Like a CharField, you can specify :attr:`~CharField.max_length` (read the note
- about database portability and :attr:`~CharField.max_length` in that section,
- too). If :attr:`~CharField.max_length` is not specified, Django will use a
- default length of 50.
- Implies setting :attr:`Field.db_index` to ``True``.
- It is often useful to automatically prepopulate a SlugField based on the value
- of some other value. You can do this automatically in the admin using
- :attr:`~django.contrib.admin.ModelAdmin.prepopulated_fields`.
- ``SmallIntegerField``
- ---------------------
- .. class:: SmallIntegerField([**options])
- Like an :class:`IntegerField`, but only allows values under a certain
- (database-dependent) point. Values from -32768 to 32767 are safe in all databases
- supported by Django.
- ``TextField``
- -------------
- .. class:: TextField([**options])
- A large text field. The default form widget for this field is a
- :class:`~django.forms.Textarea`.
- .. admonition:: MySQL users
- If you are using this field with MySQLdb 1.2.1p2 and the ``utf8_bin``
- collation (which is *not* the default), there are some issues to be aware
- of. Refer to the :ref:`MySQL database notes <mysql-collation>` for
- details.
- ``TimeField``
- -------------
- .. class:: TimeField([auto_now=False, auto_now_add=False, **options])
- A time, represented in Python by a ``datetime.time`` instance. Accepts the same
- auto-population options as :class:`DateField`.
- The default form widget for this field is a :class:`~django.forms.TextInput`.
- The admin adds some JavaScript shortcuts.
- ``URLField``
- ------------
- .. class:: URLField([max_length=200, **options])
- A :class:`CharField` for a URL.
- The default form widget for this field is a :class:`~django.forms.TextInput`.
- Like all :class:`CharField` subclasses, :class:`URLField` takes the optional
- :attr:`~CharField.max_length` argument. If you don't specify
- :attr:`~CharField.max_length`, a default of 200 is used.
- Relationship fields
- ===================
- .. module:: django.db.models.fields.related
- :synopsis: Related field types
- .. currentmodule:: django.db.models
- Django also defines a set of fields that represent relations.
- .. _ref-foreignkey:
- ``ForeignKey``
- --------------
- .. class:: ForeignKey(othermodel, [**options])
- A many-to-one relationship. Requires a positional argument: the class to which
- the model is related.
- .. _recursive-relationships:
- To create a recursive relationship -- an object that has a many-to-one
- relationship with itself -- use ``models.ForeignKey('self')``.
- .. _lazy-relationships:
- If you need to create a relationship on a model that has not yet been defined,
- you can use the name of the model, rather than the model object itself::
- from django.db import models
- class Car(models.Model):
- manufacturer = models.ForeignKey('Manufacturer')
- # ...
- class Manufacturer(models.Model):
- # ...
- pass
- To refer to models defined in another application, you can explicitly specify
- a model with the full application label. For example, if the ``Manufacturer``
- model above is defined in another application called ``production``, you'd
- need to use::
- class Car(models.Model):
- manufacturer = models.ForeignKey('production.Manufacturer')
- This sort of reference can be useful when resolving circular import
- dependencies between two applications.
- A database index is automatically created on the ``ForeignKey``. You can
- disable this by setting :attr:`~Field.db_index` to ``False``. You may want to
- avoid the overhead of an index if you are creating a foreign key for
- consistency rather than joins, or if you will be creating an alternative index
- like a partial or multiple column index.
- Database Representation
- ~~~~~~~~~~~~~~~~~~~~~~~
- Behind the scenes, Django appends ``"_id"`` to the field name to create its
- database column name. In the above example, the database table for the ``Car``
- model will have a ``manufacturer_id`` column. (You can change this explicitly by
- specifying :attr:`~Field.db_column`) However, your code should never have to
- deal with the database column name, unless you write custom SQL. You'll always
- deal with the field names of your model object.
- .. _foreign-key-arguments:
- Arguments
- ~~~~~~~~~
- :class:`ForeignKey` accepts an extra set of arguments -- all optional -- that
- define the details of how the relation works.
- .. attribute:: ForeignKey.limit_choices_to
- A dictionary of lookup arguments and values (see :doc:`/topics/db/queries`)
- that limit the available admin or ModelForm choices for this object. Use
- this with functions from the Python ``datetime`` module to limit choices of
- objects by date. For example::
- limit_choices_to = {'pub_date__lte': datetime.date.today}
- only allows the choice of related objects with a ``pub_date`` before the
- current date to be chosen.
- Instead of a dictionary this can also be a :class:`Q object
- <django.db.models.Q>` for more :ref:`complex queries
- <complex-lookups-with-q>`. However, if ``limit_choices_to`` is a :class:`Q
- object <django.db.models.Q>` then it will only have an effect on the
- choices available in the admin when the field is not listed in
- ``raw_id_fields`` in the ``ModelAdmin`` for the model.
- .. attribute:: ForeignKey.related_name
- The name to use for the relation from the related object back to this one.
- See the :ref:`related objects documentation <backwards-related-objects>` for
- a full explanation and example. Note that you must set this value
- when defining relations on :ref:`abstract models
- <abstract-base-classes>`; and when you do so
- :ref:`some special syntax <abstract-related-name>` is available.
- If you'd prefer Django not to create a backwards relation, set
- ``related_name`` to ``'+'`` or end it with ``'+'``. For example, this will
- ensure that the ``User`` model won't have a backwards relation to this
- model::
- user = models.ForeignKey(User, related_name='+')
- .. attribute:: ForeignKey.related_query_name
- .. versionadded:: 1.6
- The name to use for the reverse filter name from the target model.
- Defaults to the value of :attr:`related_name` if it is set, otherwise it
- defaults to the name of the model::
- # Declare the ForeignKey with related_query_name
- class Tag(models.Model):
- article = models.ForeignKey(Article, related_name="tags", related_query_name="tag")
- name = models.CharField(max_length=255)
- # That's now the name of the reverse filter
- article_instance.filter(tag__name="important")
- .. attribute:: ForeignKey.to_field
- The field on the related object that the relation is to. By default, Django
- uses the primary key of the related object.
- .. attribute:: ForeignKey.db_constraint
- .. versionadded:: 1.6
- Controls whether or not a constraint should be created in the database for
- this foreign key. The default is ``True``, and that's almost certainly what
- you want; setting this to ``False`` can be very bad for data integrity.
- That said, here are some scenarios where you might want to do this:
- * You have legacy data that is not valid.
- * You're sharding your database.
- If this is set to ``False``, accessing a related object that doesn't exist
- will raise its ``DoesNotExist`` exception.
- .. attribute:: ForeignKey.on_delete
- When an object referenced by a :class:`ForeignKey` is deleted, Django by
- default emulates the behavior of the SQL constraint ``ON DELETE CASCADE``
- and also deletes the object containing the ``ForeignKey``. This behavior
- can be overridden by specifying the :attr:`on_delete` argument. For
- example, if you have a nullable :class:`ForeignKey` and you want it to be
- set null when the referenced object is deleted::
- user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
- The possible values for :attr:`~ForeignKey.on_delete` are found in
- :mod:`django.db.models`:
- * .. attribute:: CASCADE
- Cascade deletes; the default.
- * .. attribute:: PROTECT
- Prevent deletion of the referenced object by raising
- :exc:`~django.db.models.ProtectedError`, a subclass of
- :exc:`django.db.IntegrityError`.
- * .. attribute:: SET_NULL
- Set the :class:`ForeignKey` null; this is only possible if
- :attr:`~Field.null` is ``True``.
- * .. attribute:: SET_DEFAULT
- Set the :class:`ForeignKey` to its default value; a default for the
- :class:`ForeignKey` must be set.
- * .. function:: SET()
- Set the :class:`ForeignKey` to the value passed to
- :func:`~django.db.models.SET()`, or if a callable is passed in,
- the result of calling it. In most cases, passing a callable will be
- necessary to avoid executing queries at the time your models.py is
- imported::
- from django.db import models
- from django.contrib.auth.models import User
- def get_sentinel_user():
- return User.objects.get_or_create(username='deleted')[0]
- class MyModel(models.Model):
- user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
- * .. attribute:: DO_NOTHING
- Take no action. If your database backend enforces referential
- integrity, this will cause an :exc:`~django.db.IntegrityError` unless
- you manually add an SQL ``ON DELETE`` constraint to the database field
- (perhaps using :ref:`initial sql<initial-sql>`).
- .. _ref-manytomany:
- ``ManyToManyField``
- -------------------
- .. class:: ManyToManyField(othermodel, [**options])
- A many-to-many relationship. Requires a positional argument: the class to
- which the model is related, which works exactly the same as it does for
- :class:`ForeignKey`, including :ref:`recursive <recursive-relationships>` and
- :ref:`lazy <lazy-relationships>` relationships.
- Related objects can be added, removed, or created with the field's
- :class:`~django.db.models.fields.related.RelatedManager`.
- Database Representation
- ~~~~~~~~~~~~~~~~~~~~~~~
- Behind the scenes, Django creates an intermediary join table to represent the
- many-to-many relationship. By default, this table name is generated using the
- name of the many-to-many field and the name of the table for the model that
- contains it. Since some databases don't support table names above a certain
- length, these table names will be automatically truncated to 64 characters and a
- uniqueness hash will be used. This means you might see table names like
- ``author_books_9cdf4``; this is perfectly normal. You can manually provide the
- name of the join table using the :attr:`~ManyToManyField.db_table` option.
- .. _manytomany-arguments:
- Arguments
- ~~~~~~~~~
- :class:`ManyToManyField` accepts an extra set of arguments -- all optional --
- that control how the relationship functions.
- .. attribute:: ManyToManyField.related_name
- Same as :attr:`ForeignKey.related_name`.
- If you have more than one ``ManyToManyField`` pointing to the same model
- and want to suppress the backwards relations, set each ``related_name``
- to a unique value ending with ``'+'``::
- users = models.ManyToManyField(User, related_name='u+')
- referents = models.ManyToManyField(User, related_name='ref+')
- .. attribute:: ForeignKey.related_query_name
- .. versionadded:: 1.6
- Same as :attr:`ForeignKey.related_query_name`.
- .. attribute:: ManyToManyField.limit_choices_to
- Same as :attr:`ForeignKey.limit_choices_to`.
- ``limit_choices_to`` has no effect when used on a ``ManyToManyField`` with a
- custom intermediate table specified using the
- :attr:`~ManyToManyField.through` parameter.
- .. attribute:: ManyToManyField.symmetrical
- Only used in the definition of ManyToManyFields on self. Consider the
- following model::
- from django.db import models
- class Person(models.Model):
- friends = models.ManyToManyField("self")
- When Django processes this model, it identifies that it has a
- :class:`ManyToManyField` on itself, and as a result, it doesn't add a
- ``person_set`` attribute to the ``Person`` class. Instead, the
- :class:`ManyToManyField` is assumed to be symmetrical -- that is, if I am
- your friend, then you are my friend.
- If you do not want symmetry in many-to-many relationships with ``self``, set
- :attr:`~ManyToManyField.symmetrical` to ``False``. This will force Django to
- add the descriptor for the reverse relationship, allowing
- :class:`ManyToManyField` relationships to be non-symmetrical.
- .. attribute:: ManyToManyField.through
- Django will automatically generate a table to manage many-to-many
- relationships. However, if you want to manually specify the intermediary
- table, you can use the :attr:`~ManyToManyField.through` option to specify
- the Django model that represents the intermediate table that you want to
- use.
- The most common use for this option is when you want to associate
- :ref:`extra data with a many-to-many relationship
- <intermediary-manytomany>`.
- .. attribute:: ManyToManyField.db_table
- The name of the table to create for storing the many-to-many data. If this
- is not provided, Django will assume a default name based upon the names of:
- the table for the model defining the relationship and the name of the field
- itself.
- .. attribute:: ManyToManyField.db_constraint
- .. versionadded:: 1.6
- Controls whether or not constraints should be created in the database for
- the foreign keys in the intermediary table. The default is ``True``, and
- that's almost certainly what you want; setting this to ``False`` can be
- very bad for data integrity. That said, here are some scenarios where you
- might want to do this:
- * You have legacy data that is not valid.
- * You're sharding your database.
- It is an error to pass both ``db_constraint`` and ``through``.
- .. _ref-onetoone:
- ``OneToOneField``
- -----------------
- .. class:: OneToOneField(othermodel, [parent_link=False, **options])
- A one-to-one relationship. Conceptually, this is similar to a
- :class:`ForeignKey` with :attr:`unique=True <Field.unique>`, but the
- "reverse" side of the relation will directly return a single object.
- This is most useful as the primary key of a model which "extends"
- another model in some way; :ref:`multi-table-inheritance` is
- implemented by adding an implicit one-to-one relation from the child
- model to the parent model, for example.
- One positional argument is required: the class to which the model will be
- related. This works exactly the same as it does for :class:`ForeignKey`,
- including all the options regarding :ref:`recursive <recursive-relationships>`
- and :ref:`lazy <lazy-relationships>` relationships.
- .. _onetoone-arguments:
- Additionally, ``OneToOneField`` accepts all of the extra arguments
- accepted by :class:`ForeignKey`, plus one extra argument:
- .. attribute:: OneToOneField.parent_link
- When ``True`` and used in a model which inherits from another
- (concrete) model, indicates that this field should be used as the
- link back to the parent class, rather than the extra
- ``OneToOneField`` which would normally be implicitly created by
- subclassing.
|