mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.5 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. To work around name collisions, part of the
 | |
|     name may contain ``'%(app_label)s'`` and ``'%(class)s'``, which are
 | |
|     replaced, respectively, by the lowercased app label and class name of the
 | |
|     concrete model. For example ``CheckConstraint(check=Q(age__gte=18),
 | |
|     name='%(app_label)s_%(class)s_is_adult')``.
 | |
| 
 | |
| .. 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 without a
 | |
|     :attr:`~UniqueConstraint.condition` (i.e. non-partial unique constraints)
 | |
|     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.
 | |
| 
 | |
| .. versionchanged:: 3.0
 | |
| 
 | |
|    Interpolation of  ``'%(app_label)s'`` and ``'%(class)s'`` was added.
 | |
| 
 | |
| ``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.
 | |
| 
 | |
| .. versionchanged:: 3.0
 | |
| 
 | |
|    Interpolation of  ``'%(app_label)s'`` and ``'%(class)s'`` was added.
 | |
| 
 | |
| ``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`.
 |