Django

Code

Changeset 7318

Show
Ignore:
Timestamp:
03/19/08 09:24:23 (5 months ago)
Author:
mtredinnick
Message:

queryset-refactor: Added support for munging of insert columns.
Needed to support cases like GIS fields. Patch from Justin Bronn.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/db/models/sql/subqueries.py

    r7253 r7318  
    127127        result.append('SET') 
    128128        values, update_params = [], [] 
    129         for name, val in self.values: 
     129        for name, val, placeholder in self.values: 
    130130            if val is not None: 
    131                 values.append('%s = %%s' % qn(name)) 
     131                values.append('%s = %s' % (qn(name), placeholder)) 
    132132                update_params.append(val) 
    133133            else: 
     
    191191                    pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), 
    192192                    AND) 
    193             self.values = [(related_field.column, None)] 
     193            self.values = [(related_field.column, None, '%s')] 
    194194            self.execute_sql(None) 
    195195 
    196196    def add_update_values(self, values): 
    197197        from django.db.models.base import Model 
    198         for name, val in values.items(): 
     198        for name, val in values.iteritems(): 
    199199            field, model, direct, m2m = self.model._meta.get_field_by_name(name) 
    200200            if not direct or m2m: 
     
    203203            if field.rel and isinstance(val, Model): 
    204204                val = val.pk 
     205 
     206            # Getting the placeholder for the field. 
     207            if hasattr(field, 'get_placeholder'): 
     208                placeholder = field.get_placeholder(val) 
     209            else: 
     210                placeholder = '%s' 
     211 
    205212            if model: 
    206                 self.add_related_update(model, field.column, val
     213                self.add_related_update(model, field.column, val, placeholder
    207214            else: 
    208                 self.values.append((field.column, val)) 
    209  
    210     def add_related_update(self, model, column, value): 
     215                self.values.append((field.column, val, placeholder)) 
     216 
     217    def add_related_update(self, model, column, value, placeholder): 
    211218        """ 
    212219        Adds (name, value) to an update query for an ancestor model. 
     
    215222        """ 
    216223        try: 
    217             self.related_updates[model].append((column, value)) 
     224            self.related_updates[model].append((column, value, placeholder)) 
    218225        except KeyError: 
    219             self.related_updates[model] = [(column, value)] 
     226            self.related_updates[model] = [(column, value, placeholder)] 
    220227 
    221228    def get_related_updates(self): 
     
    228235            return [] 
    229236        result = [] 
    230         for model, values in self.related_updates.items(): 
     237        for model, values in self.related_updates.iteritems(): 
    231238            query = UpdateQuery(model, self.connection) 
    232239            query.values = values 
     
    273280        into the query, for example. 
    274281        """ 
    275         func = lambda x: self.model._meta.get_field_by_name(x)[0].column 
     282        func = lambda x: self.model._meta.get_field_by_name(x)[0] 
    276283        # keys() and values() return items in the same order, providing the 
    277284        # dictionary hasn't changed between calls. So the dual iteration here 
    278285        # works as intended. 
    279         for name in insert_values: 
     286        placeholders, values = [], [] 
     287        for name, val in insert_values.iteritems(): 
    280288            if name == 'pk': 
    281289                name = self.model._meta.pk.name 
    282             self.columns.append(func(name)) 
     290            # Getting the Field associated w/the name. 
     291            field = func(name) 
     292 
     293            if hasattr(field, 'get_placeholder'): 
     294                # Some fields (e.g. geo fields) need special munging before 
     295                # they can be inserted. 
     296                placeholders.append(field.get_placeholder(val)) 
     297            else: 
     298                placeholders.append('%s') 
     299 
     300            self.columns.append(field.column) 
     301            values.append(val) 
    283302        if raw_values: 
    284             self.values.extend(insert_values.values()
     303            self.values.extend(values
    285304        else: 
    286             values = insert_values.values() 
    287305            self.params += tuple(values) 
    288             self.values.extend(['%s'] * len(values)
     306            self.values.extend(placeholders
    289307 
    290308class DateQuery(Query):