Changeset 2260
- Timestamp:
- 02/03/06 18:07:03 (3 years ago)
- Files:
-
- django/branches/magic-removal/django/db/models/fields/related.py (modified) (2 diffs)
- django/branches/magic-removal/django/db/models/manager.py (modified) (3 diffs)
- django/branches/magic-removal/django/db/models/query.py (modified) (1 diff)
- django/branches/magic-removal/tests/modeltests/get_latest/models.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/magic-removal/django/db/models/fields/related.py
r2255 r2260 127 127 manager.core_filters = {'%s__%s__exact' % (rel_field.name, instance_type._meta.pk.name): instance._get_pk_val()} 128 128 129 # Prepare the manager.130 # TODO: Fix this hack?131 # We're setting manager.model here because manager._prepare() expects132 # that manager.model is set. This is slightly hackish.133 129 manager.model = self.related.model 134 manager._prepare()135 130 136 131 return manager … … 195 190 196 191 manager = RelatedManager() 197 198 # Prepare the manager.199 # TODO: Fix this hack?200 # We're setting manager.model here because manager._prepare() expects201 # that manager.model is set. This is slightly hackish.202 192 manager.model = self.rel_model 203 manager._prepare()204 193 205 194 return manager django/branches/magic-removal/django/db/models/manager.py
r2252 r2260 17 17 raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % name 18 18 cls.add_to_class('objects', Manager()) 19 cls.objects._prepare()20 19 21 20 dispatcher.connect(ensure_default_manager, signal=signals.class_prepared) … … 32 31 self.model = None 33 32 34 def _prepare(self):35 if self.model._meta.get_latest_by:36 self.get_latest = self.__get_latest37 38 33 def contribute_to_class(self, model, name): 39 34 # TODO: Use weakref because of possible memory leak / circular reference. 40 35 self.model = model 41 dispatcher.connect(self._prepare, signal=signals.class_prepared, sender=model)42 36 setattr(model, name, ManagerDescriptor(self)) 43 37 if not hasattr(model, '_default_manager') or self.creation_counter < model._default_manager.creation_counter: 44 38 model._default_manager = self 45 46 def __get_latest(self, *args, **kwargs):47 kwargs['order_by'] = ('-' + self.model._meta.get_latest_by,)48 kwargs['limit'] = 149 return self.get_object(*args, **kwargs)50 39 51 40 ####################### … … 90 79 return self.get_query_set().iterator(*args, **kwargs) 91 80 81 def latest(self, *args, **kwargs): 82 return self.get_query_set().latest(*args, **kwargs) 83 92 84 def order_by(self, *args, **kwargs): 93 85 return self.get_query_set().order_by(*args, **kwargs) django/branches/magic-removal/django/db/models/query.py
r2257 r2260 162 162 assert len(obj_list) == 1, "get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.model._meta.object_name, len(obj_list), kwargs) 163 163 return obj_list[0] 164 165 def latest(self, field_name=None): 166 """ 167 Returns the latest object, according to the model's 'get_latest_by' 168 option or optional given field_name. 169 """ 170 latest_by = field_name or self.model._meta.get_latest_by 171 assert bool(latest_by), "latest() requires either a field_name parameter or 'get_latest_by' in the model" 172 return self._clone(_limit=1, _order_by=('-'+latest_by,)).get() 164 173 165 174 def delete(self, *args, **kwargs): django/branches/magic-removal/tests/modeltests/get_latest/models.py
r1754 r2260 13 13 class Article(models.Model): 14 14 headline = models.CharField(maxlength=100) 15 pub_date = models.DateTimeField() 15 pub_date = models.DateField() 16 expire_date = models.DateField() 16 17 class Meta: 17 18 get_latest_by = 'pub_date' … … 20 21 return self.headline 21 22 23 class Person(models.Model): 24 name = models.CharField(maxlength=30) 25 birthday = models.DateField() 26 27 # Note that this model doesn't have "get_latest_by" set. 28 29 def __repr__(self): 30 return self.name 31 22 32 API_TESTS = """ 23 33 # Because no Articles exist yet, get_latest() raises ArticleDoesNotExist. 24 >>> Article.objects. get_latest()34 >>> Article.objects.latest() 25 35 Traceback (most recent call last): 26 36 ... 27 DoesNotExist: Article does not exist for {'order_by': ('-pub_date',), 'limit': 1}37 DoesNotExist: Article does not exist for ... 28 38 29 39 # Create a couple of Articles. 30 40 >>> from datetime import datetime 31 >>> a1 = Article( id=None, headline='Article 1', pub_date=datetime(2005, 7, 26))41 >>> a1 = Article(headline='Article 1', pub_date=datetime(2005, 7, 26), expire_date=datetime(2005, 9, 1)) 32 42 >>> a1.save() 33 >>> a2 = Article( id=None, headline='Article 2', pub_date=datetime(2005, 7, 27))43 >>> a2 = Article(headline='Article 2', pub_date=datetime(2005, 7, 27), expire_date=datetime(2005, 7, 28)) 34 44 >>> a2.save() 35 >>> a3 = Article( id=None, headline='Article 3', pub_date=datetime(2005, 7, 27))45 >>> a3 = Article(headline='Article 3', pub_date=datetime(2005, 7, 27), expire_date=datetime(2005, 8, 27)) 36 46 >>> a3.save() 37 >>> a4 = Article( id=None, headline='Article 4', pub_date=datetime(2005, 7, 28))47 >>> a4 = Article(headline='Article 4', pub_date=datetime(2005, 7, 28), expire_date=datetime(2005, 7, 30)) 38 48 >>> a4.save() 39 49 40 50 # Get the latest Article. 41 >>> Article.objects. get_latest()51 >>> Article.objects.latest() 42 52 Article 4 53 54 # Get the latest Article that matches certain filters. 55 >>> Article.objects.filter(pub_date__lt=datetime(2005, 7, 27)).latest() 56 Article 1 57 58 # Pass a custom field name to latest() to change the field that's used to 59 # determine the latest object. 60 >>> Article.objects.latest('expire_date') 61 Article 1 62 63 >>> Article.objects.filter(pub_date__gt=datetime(2005, 7, 26)).latest('expire_date') 64 Article 3 65 66 # You can still use latest() with a model that doesn't have "get_latest_by" 67 # set -- just pass in the field name manually. 68 >>> p1 = Person(name='Ralph', birthday=datetime(1950, 1, 1)) 69 >>> p1.save() 70 >>> p2 = Person(name='Stephanie', birthday=datetime(1960, 2, 3)) 71 >>> p2.save() 72 >>> Person.objects.latest() 73 Traceback (most recent call last): 74 ... 75 AssertionError: latest() requires either a field_name parameter or 'get_latest_by' in the model 76 77 >>> Person.objects.latest('birthday') 78 Stephanie 43 79 """
