diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index 1b02b7d403..4f459838f2 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -2629,6 +2629,13 @@ we can do this with inline admin models. Suppose we have the following models:: date_joined = models.DateField() invite_reason = models.CharField(max_length=64) + class Meta: + constraints = [ + models.UniqueConstraint( + fields=["person", "group"], name="unique_person_group" + ) + ] + The first step in displaying this intermediate model in the admin is to define an inline class for the ``Membership`` model:: diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt index 52cf0b8286..c45688184d 100644 --- a/docs/ref/models/fields.txt +++ b/docs/ref/models/fields.txt @@ -2028,13 +2028,6 @@ that control how the relationship functions. :ref:`extra data with a many-to-many relationship `. - .. note:: - - If you don't want multiple associations between the same instances, add - a :class:`~django.db.models.UniqueConstraint` including the from and to - fields. Django's automatically generated many-to-many tables include - such a constraint. - .. note:: Recursive relationships using an intermediary model can't determine the @@ -2045,7 +2038,9 @@ that control how the relationship functions. If you don't specify an explicit ``through`` model, there is still an implicit ``through`` model class you can use to directly access the table - created to hold the association. It has three fields to link the models. + created to hold the association. It has three fields to link the models, a + primary key and two foreign keys. There is a unique constraint on the two + foreign keys. If the source and target models differ, the following fields are generated: diff --git a/docs/topics/db/models.txt b/docs/topics/db/models.txt index 415d3829dd..b7bd36bc81 100644 --- a/docs/topics/db/models.txt +++ b/docs/topics/db/models.txt @@ -503,10 +503,22 @@ something like this:: date_joined = models.DateField() invite_reason = models.CharField(max_length=64) + class Meta: + constraints = [ + models.UniqueConstraint( + fields=["person", "group"], name="unique_person_group" + ) + ] + When you set up the intermediary model, you explicitly specify foreign keys to the models that are involved in the many-to-many relationship. This explicit declaration defines how the two models are related. +If you don't want multiple associations between the same instances, add a +:class:`~django.db.models.UniqueConstraint` including the ``from`` and ``to`` +fields. Django's automatically generated many-to-many tables include such a +constraint. + There are a few restrictions on the intermediate model: * Your intermediate model must contain one - and *only* one - foreign key