@@ -886,13 +886,19 @@ relationship should work. All are optional:
886
886
`related objects documentation`_ for a full
887
887
explanation and example.
888
888
889
+ If using this in an `abstract base class`_, be
890
+ sure to read the `extra notes`_ in that section
891
+ about ``related_name``.
892
+
889
893
``to_field`` The field on the related object that the relation
890
894
is to. By default, Django uses the primary key of
891
895
the related object.
892
896
======================= ============================================================
893
897
894
898
.. _`Database API reference`: ../db-api/
895
899
.. _related objects documentation: ../db-api/#related-objects
900
+ .. _abstract base class: `Abstract base classes`_
901
+ .. _extra notes: `Be careful with related_name`_
896
902
897
903
Many-to-many relationships
898
904
~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -2146,6 +2152,39 @@ abstract base class. For example, including ``db_table`` would mean that all
2146
2152
the child classes (the ones that don't specify their own ``Meta``) would use
2147
2153
the same database table, which is almost certainly not what you want.
2148
2154
2155
+ Be careful with ``related_name``
2156
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2157
+
2158
+ If you are using the ``related_name`` attribute on a ``ForeignKey`` or
2159
+ ``ManyToManyField``, you must always specify a *unique* reverse name for the
2160
+ field. This would normally cause a problem in abstract base classes, since the
2161
+ fields on this class are included into each of the child classes, with exactly
2162
+ the same values for the attributes (including ``related_name``) each time.
2163
+
2164
+ To work around this problem, when you are using ``related_name`` in an
2165
+ abstract base class (only), part of the name should be the string
2166
+ ``'%(class)s'``. This is replaced by the lower-cased name of the child class
2167
+ that the field is used in. Since each class has a different name, each related
2168
+ name will end up being different. For example::
2169
+
2170
+ class Base(models.Model):
2171
+ m2m = models.ManyToMany(OtherModel, related_name="%(class)s_related")
2172
+
2173
+ class Meta:
2174
+ abstract = True
2175
+
2176
+ class ChildA(Base):
2177
+ pass
2178
+
2179
+ class ChildB(Base):
2180
+ pass
2181
+
2182
+ The reverse name of the ``ChildA.m2m`` field will be ``childa_related``,
2183
+ whilst the reverse name of the ``ChildB.m2m`` field will be
2184
+ ``childb_related``. It is up to you how you use the ``'%(class)s'`` portion to
2185
+ construct your related name, but if you forget to use it, Django will raise
2186
+ errors when you validate your models (or run ``syncdb``).
2187
+
2149
2188
Multi-table inheritance
2150
2189
-----------------------
2151
2190
0 commit comments