Changeset 7432
- Timestamp:
- 04/16/08 03:09:46 (3 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/queryset-refactor/django/db/models/fields/related.py
r7396 r7432 1 import copy 2 1 3 from django.db import connection, transaction 2 4 from django.db.models import signals, get_model … … 109 111 else: 110 112 self.do_related_class(other, cls) 113 if not cls._meta.abstract and self.rel.related_name: 114 self.rel.related_name = self.rel.related_name % {'class': cls.__name__.lower()} 111 115 112 116 def set_attributes_from_rel(self): … … 150 154 151 155 def _get_related_query_name(self, opts): 152 # This method defines the name that can be used to identify this related object 153 # in a table-spanning query. It uses the lower-cased object_name by default, 154 # but this can be overridden with the "related_name" option. 156 # This method defines the name that can be used to identify this 157 # related object in a table-spanning query. It uses the lower-cased 158 # object_name by default, but this can be overridden with the 159 # "related_name" option. 155 160 return self.rel.related_name or opts.object_name.lower() 156 161 django/branches/queryset-refactor/docs/model-api.txt
r7341 r7432 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 … … 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 … … 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 -----------------------
