Changeset 7437
- Timestamp:
- 04/20/08 03:47:21 (3 months ago)
- Files:
-
- django/branches/queryset-refactor/django/db/models/base.py (modified) (2 diffs)
- django/branches/queryset-refactor/django/db/models/manager.py (modified) (1 diff)
- django/branches/queryset-refactor/django/db/models/query.py (modified) (3 diffs)
- django/branches/queryset-refactor/django/db/models/sql/subqueries.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/queryset-refactor/django/db/models/base.py
r7431 r7437 309 309 # It does already exist, so do an UPDATE. 310 310 if non_pks: 311 values = [(f .name, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, False))) for f in non_pks]312 manager.filter(pk=pk_val). update(**dict(values))311 values = [(f, None, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, False))) for f in non_pks] 312 manager.filter(pk=pk_val)._update(values) 313 313 else: 314 314 record_exists = False 315 315 if not pk_set or not record_exists: 316 316 if not pk_set: 317 values = [(f .name, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField)]318 else: 319 values = [(f .name, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields]317 values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField)] 318 else: 319 values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields] 320 320 321 321 if meta.order_with_respect_to: 322 322 field = meta.order_with_respect_to 323 values.append(( '_order', manager.filter(**{field.name: getattr(self, field.attname)}).count()))323 values.append((meta.get_field_by_name('_order')[0], manager.filter(**{field.name: getattr(self, field.attname)}).count())) 324 324 record_exists = False 325 325 … … 327 327 if values: 328 328 # Create a new record. 329 result = manager._insert( __return_id=update_pk, **dict(values))329 result = manager._insert(values, return_id=update_pk) 330 330 else: 331 331 # Create a new record with defaults for everything. 332 result = manager._insert(__return_id=update_pk, 333 __raw_values=True, pk=connection.ops.pk_default_value()) 332 result = manager._insert([(meta.pk, connection.ops.pk_default_value())], return_id=update_pk, raw_values=True) 334 333 335 334 if update_pk: django/branches/queryset-refactor/django/db/models/manager.py
r7339 r7437 124 124 return self.get_query_set().reverse(*args, **kwargs) 125 125 126 def _insert(self, **kwargs): 127 return insert_query(self.model, **kwargs) 126 def _insert(self, values, **kwargs): 127 return insert_query(self.model, values, **kwargs) 128 129 def _update(self, values, **kwargs): 130 return self.get_query_set()._update(values, **kwargs) 128 131 129 132 class ManagerDescriptor(object): django/branches/queryset-refactor/django/db/models/query.py
r7426 r7437 288 288 update.alters_data = True 289 289 290 def _update(self, values): 291 """ 292 A version of update that accepts field objects instead of field names. 293 Used primarily for model saving and not intended for use by general 294 code (it requires too much poking around at model internals to be 295 useful at that level). 296 """ 297 query = self.query.clone(sql.UpdateQuery) 298 query.add_update_fields(values) 299 query.execute_sql(None) 300 self._result_cache = None 301 _update.alters_data = True 302 290 303 ################################################## 291 304 # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS # … … 693 706 transaction.commit_unless_managed() 694 707 695 def insert_query( __model, __return_id=False, __raw_values=False, **kwargs):708 def insert_query(model, values, return_id=False, raw_values=False): 696 709 """ 697 710 Inserts a new record for the given model. This provides an interface to … … 699 712 part of the public API. 700 713 """ 701 query = sql.InsertQuery( __model, connection)702 query.insert_values( kwargs, __raw_values)703 return query.execute_sql( __return_id)704 714 query = sql.InsertQuery(model, connection) 715 query.insert_values(values, raw_values) 716 return query.execute_sql(return_id) 717 django/branches/queryset-refactor/django/db/models/sql/subqueries.py
r7428 r7437 195 195 196 196 def add_update_values(self, values): 197 from django.db.models.base import Model 197 """ 198 Convert a dictionary of field name to value mappings into an update 199 query. This is the entry point for the public update() method on 200 querysets. 201 """ 202 values_seq = [] 198 203 for name, val in values.iteritems(): 199 204 field, model, direct, m2m = self.model._meta.get_field_by_name(name) 200 205 if not direct or m2m: 201 206 raise FieldError('Cannot update model field %r (only non-relations and foreign keys permitted).' % field) 207 values_seq.append((field, model, val)) 208 return self.add_update_fields(values_seq) 209 210 def add_update_fields(self, values_seq): 211 """ 212 Turn a sequence of (field, model, value) triples into an update query. 213 Used by add_update_values() as well as the "fast" update path when 214 saving models. 215 """ 216 from django.db.models.base import Model 217 for field, model, val in values_seq: 202 218 # FIXME: Some sort of db_prep_* is probably more appropriate here. 203 219 if field.rel and isinstance(val, Model): … … 280 296 into the query, for example. 281 297 """ 282 func = lambda x: self.model._meta.get_field_by_name(x)[0]283 298 # keys() and values() return items in the same order, providing the 284 299 # dictionary hasn't changed between calls. So the dual iteration here 285 300 # works as intended. 286 301 placeholders, values = [], [] 287 for name, val in insert_values.iteritems(): 288 if name == 'pk': 289 name = self.model._meta.pk.name 290 # Getting the Field associated w/the name. 291 field = func(name) 292 302 for field, val in insert_values: 293 303 if hasattr(field, 'get_placeholder'): 294 304 # Some fields (e.g. geo fields) need special munging before
