mirror of
https://github.com/django/django.git
synced 2024-12-24 10:05:46 +00:00
108 lines
3.1 KiB
Plaintext
108 lines
3.1 KiB
Plaintext
=====================
|
||
Constraints reference
|
||
=====================
|
||
|
||
.. module:: django.db.models.constraints
|
||
|
||
.. currentmodule:: django.db.models
|
||
|
||
.. versionadded:: 2.2
|
||
|
||
The classes defined in this module create database constraints. They are added
|
||
in the model :attr:`Meta.constraints <django.db.models.Options.constraints>`
|
||
option.
|
||
|
||
.. admonition:: Referencing built-in constraints
|
||
|
||
Constraints are defined in ``django.db.models.constraints``, 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 the
|
||
constraints as ``models.<Foo>Constraint``.
|
||
|
||
.. admonition:: Constraints in abstract base classes
|
||
|
||
You must always specify a unique name for the constraint. As such, you
|
||
cannot normally specify a constraint on an abstract base class, since the
|
||
:attr:`Meta.constraints <django.db.models.Options.constraints>` option is
|
||
inherited by subclasses, with exactly the same values for the attributes
|
||
(including ``name``) each time. Instead, specify the ``constraints`` option
|
||
on subclasses directly, providing a unique name for each constraint.
|
||
|
||
.. admonition:: Validation of Constraints
|
||
|
||
In general constraints are **not** checked during ``full_clean()``, and do
|
||
not raise ``ValidationError``\s. Rather you'll get a database integrity
|
||
error on ``save()``. ``UniqueConstraint``\s are different in this regard,
|
||
in that they leverage the existing ``validate_unique()`` logic, and thus
|
||
enable two-stage validation. In addition to ``IntegrityError`` on
|
||
``save()``, ``ValidationError`` is also raised during model validation when
|
||
the ``UniqueConstraint`` is violated.
|
||
|
||
``CheckConstraint``
|
||
===================
|
||
|
||
.. class:: CheckConstraint(*, check, name)
|
||
|
||
Creates a check constraint in the database.
|
||
|
||
``check``
|
||
---------
|
||
|
||
.. attribute:: CheckConstraint.check
|
||
|
||
A :class:`Q` object that specifies the check you want the constraint to
|
||
enforce.
|
||
|
||
For example, ``CheckConstraint(check=Q(age__gte=18), name='age_gte_18')``
|
||
ensures the age field is never less than 18.
|
||
|
||
``name``
|
||
--------
|
||
|
||
.. attribute:: CheckConstraint.name
|
||
|
||
The name of the constraint.
|
||
|
||
``UniqueConstraint``
|
||
====================
|
||
|
||
.. class:: UniqueConstraint(*, fields, name, condition=None)
|
||
|
||
Creates a unique constraint in the database.
|
||
|
||
``fields``
|
||
----------
|
||
|
||
.. attribute:: UniqueConstraint.fields
|
||
|
||
A list of field names that specifies the unique set of columns you want the
|
||
constraint to enforce.
|
||
|
||
For example, ``UniqueConstraint(fields=['room', 'date'],
|
||
name='unique_booking')`` ensures each room can only be booked once for each
|
||
date.
|
||
|
||
``name``
|
||
--------
|
||
|
||
.. attribute:: UniqueConstraint.name
|
||
|
||
The name of the constraint.
|
||
|
||
``condition``
|
||
-------------
|
||
|
||
.. attribute:: UniqueConstraint.condition
|
||
|
||
A :class:`Q` object that specifies the condition you want the constraint to
|
||
enforce.
|
||
|
||
For example::
|
||
|
||
UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')
|
||
|
||
ensures that each user only has one draft.
|
||
|
||
These conditions have the same database restrictions as
|
||
:attr:`Index.condition`.
|