Changeset 7318
- Timestamp:
- 03/19/08 09:24:23 (5 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/queryset-refactor/django/db/models/sql/subqueries.py
r7253 r7318 127 127 result.append('SET') 128 128 values, update_params = [], [] 129 for name, val in self.values:129 for name, val, placeholder in self.values: 130 130 if val is not None: 131 values.append('%s = % %s' % qn(name))131 values.append('%s = %s' % (qn(name), placeholder)) 132 132 update_params.append(val) 133 133 else: … … 191 191 pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), 192 192 AND) 193 self.values = [(related_field.column, None )]193 self.values = [(related_field.column, None, '%s')] 194 194 self.execute_sql(None) 195 195 196 196 def add_update_values(self, values): 197 197 from django.db.models.base import Model 198 for name, val in values.ite ms():198 for name, val in values.iteritems(): 199 199 field, model, direct, m2m = self.model._meta.get_field_by_name(name) 200 200 if not direct or m2m: … … 203 203 if field.rel and isinstance(val, Model): 204 204 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 205 212 if model: 206 self.add_related_update(model, field.column, val )213 self.add_related_update(model, field.column, val, placeholder) 207 214 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): 211 218 """ 212 219 Adds (name, value) to an update query for an ancestor model. … … 215 222 """ 216 223 try: 217 self.related_updates[model].append((column, value ))224 self.related_updates[model].append((column, value, placeholder)) 218 225 except KeyError: 219 self.related_updates[model] = [(column, value )]226 self.related_updates[model] = [(column, value, placeholder)] 220 227 221 228 def get_related_updates(self): … … 228 235 return [] 229 236 result = [] 230 for model, values in self.related_updates.ite ms():237 for model, values in self.related_updates.iteritems(): 231 238 query = UpdateQuery(model, self.connection) 232 239 query.values = values … … 273 280 into the query, for example. 274 281 """ 275 func = lambda x: self.model._meta.get_field_by_name(x)[0] .column282 func = lambda x: self.model._meta.get_field_by_name(x)[0] 276 283 # keys() and values() return items in the same order, providing the 277 284 # dictionary hasn't changed between calls. So the dual iteration here 278 285 # works as intended. 279 for name in insert_values: 286 placeholders, values = [], [] 287 for name, val in insert_values.iteritems(): 280 288 if name == 'pk': 281 289 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) 283 302 if raw_values: 284 self.values.extend( insert_values.values())303 self.values.extend(values) 285 304 else: 286 values = insert_values.values()287 305 self.params += tuple(values) 288 self.values.extend( ['%s'] * len(values))306 self.values.extend(placeholders) 289 307 290 308 class DateQuery(Query):
