Django

Code

Changeset 2381

Show
Ignore:
Timestamp:
02/24/06 04:25:02 (3 years ago)
Author:
russellm
Message:

magic-removal: Refs #1346 -- Refactored query logic for m2m descriptor fields, and added logic to m2m name methods to allow m2m_recursive tests to create a valid SQL table.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/magic-removal/django/db/models/fields/related.py

    r2374 r2381  
    4747    def contribute_to_class(self, cls, name): 
    4848        sup = super(RelatedField, self) 
     49 
     50        # Add an accessor to allow easy determination of the related query path for this field 
     51        self.related_query_name = curry(self._get_related_query_name, cls._meta) 
     52 
    4953        if hasattr(sup, 'contribute_to_class'): 
    5054            sup.contribute_to_class(cls, name) 
     
    6670        related = RelatedObject(other, cls, self) 
    6771        self.contribute_to_related_class(other, related) 
     72 
     73    def _get_related_query_name(self, opts): 
     74        # This method defines the name that can be used to identify this related object 
     75        # in a table-spanning query. It uses the lower-cased object_name by default, 
     76        # but this can be overridden with the "related_name" option. 
     77        return self.rel.related_name or opts.object_name.lower() 
    6878 
    6979class SingleRelatedObjectDescriptor(object): 
     
    242252 
    243253        if self.rel_type == 'o2m': 
    244             manager.core_filters = {'%s__%s__exact' % (rel_field.name, rel_field.rel.to._meta.pk.name): getattr(instance, rel_field.rel.get_related_field().attname)} 
    245         else: 
    246             manager.core_filters = {'%s__%s__exact' % (rel_field.name, instance_type._meta.pk.name): instance._get_pk_val()} 
     254            manager.core_filters = {'%s__pk' % rel_field.name: getattr(instance, rel_field.rel.get_related_field().attname)} 
     255        else: 
     256            manager.core_filters = {'%s__pk' % rel_field.name: instance._get_pk_val()} 
    247257 
    248258        manager.model = self.related.model 
     
    286296                    params = [instance._get_pk_val()] 
    287297                ) 
     298                return superclass.get_query_set(self).filter(**(self.core_filters)) 
     299 
    288300            def add(self, *objs, **kwargs): 
    289301                _add_m2m_items(self, superclass, rel_model, join_table, source_col_name, 
     
    301313 
    302314        manager = RelatedManager() 
     315         
     316        manager.core_filters = {'%s__pk' % self.field.related_query_name() : instance._get_pk_val()} 
     317         
    303318        manager.model = rel_model 
    304319 
     
    471486    def _get_m2m_column_name(self, related): 
    472487        "Function that can be curried to provide the source column name for the m2m table" 
    473         return related.model._meta.object_name.lower() + '_id' 
    474  
     488        # If this is an m2m relation to self, avoid the inevitable name clash  
     489        if related.model == related.parent_model: 
     490            return 'from_' + related.model._meta.object_name.lower() + '_id' 
     491        else: 
     492            return related.model._meta.object_name.lower() + '_id' 
     493         
    475494    def _get_m2m_reverse_name(self, related): 
    476495        "Function that can be curried to provide the related column name for the m2m table" 
    477         return related.parent_model._meta.object_name.lower() + '_id' 
     496        # If this is an m2m relation to self, avoid the inevitable name clash  
     497        if related.model == related.parent_model: 
     498            return 'to_' + related.parent_model._meta.object_name.lower() + '_id'         
     499        else: 
     500            return related.parent_model._meta.object_name.lower() + '_id' 
    478501 
    479502    def isValidIDList(self, field_data, all_data): 
  • django/branches/magic-removal/django/db/models/query.py

    r2362 r2381  
    614614    """ 
    615615    if related_query: 
    616         matches = [f for f in field_list if f.get_query_name() == name] 
     616        matches = [f for f in field_list if f.field.related_query_name() == name] 
    617617    else: 
    618618        matches = [f for f in field_list if f.name == name] 
  • django/branches/magic-removal/django/db/models/related.py

    r2362 r2381  
    7575        # but this can be overridden with the "related_name" option. 
    7676        return self.field.rel.related_name or (self.opts.object_name.lower() + '_set') 
    77  
    78     def get_query_name(self): 
    79         # This method defines the name that can be used to identify this related object 
    80         # in a table-spanning query. It uses the lower-cased object_name by default, 
    81         # but this can be overridden with the "related_name" option. 
    82         return self.field.rel.related_name or self.opts.object_name.lower()