2
0
Эх сурвалжийг харах

Fixed #36128 -- Clarified auto-generated unique constraint on m2m through models.

Clifford Gama 1 сар өмнө
parent
commit
ae2736ca3b

+ 7 - 0
docs/ref/contrib/admin/index.txt

@@ -2614,6 +2614,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::
 

+ 3 - 8
docs/ref/models/fields.txt

@@ -2028,13 +2028,6 @@ that control how the relationship functions.
     :ref:`extra data with a many-to-many relationship
     <intermediary-manytomany>`.
 
-    .. 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:

+ 12 - 0
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