Changeset 7148
- Timestamp:
- 02/22/08 19:35:34 (4 months ago)
- Files:
-
- django/branches/queryset-refactor/django/db/models/manager.py (modified) (1 diff)
- django/branches/queryset-refactor/django/db/models/query.py (modified) (1 diff)
- django/branches/queryset-refactor/django/db/models/sql/query.py (modified) (6 diffs)
- django/branches/queryset-refactor/docs/db-api.txt (modified) (1 diff)
- django/branches/queryset-refactor/tests/modeltests/ordering/models.py (modified) (2 diffs)
- django/branches/queryset-refactor/tests/regressiontests/queries/models.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/queryset-refactor/django/db/models/manager.py
r7146 r7148 105 105 return self.get_query_set().update(*args, **kwargs) 106 106 107 def reverse(self, *args, **kwargs): 108 return self.get_query_set().reverse(*args, **kwargs) 109 107 110 def _insert(self, *args, **kwargs): 108 111 return self.get_query_set()._insert(*args, **kwargs) django/branches/queryset-refactor/django/db/models/query.py
r7094 r7148 408 408 if order_by: 409 409 clone.query.extra_order_by = order_by 410 return clone 411 412 def reverse(self): 413 """ 414 Reverses the ordering of the queryset. 415 """ 416 clone = self._clone() 417 clone.query.standard_ordering = not clone.query.standard_ordering 410 418 return clone 411 419 django/branches/queryset-refactor/django/db/models/sql/query.py
r7147 r7148 93 93 self.default_cols = True 94 94 self.default_ordering = True 95 self.standard_ordering = True 95 96 96 97 # SQL-related attributes … … 161 162 obj.default_cols = self.default_cols 162 163 obj.default_ordering = self.default_ordering 164 obj.standard_ordering = self.standard_ordering 163 165 obj.select = self.select[:] 164 166 obj.tables = self.tables[:] … … 488 490 select_aliases = self._select_aliases 489 491 result = [] 492 if self.standard_ordering: 493 asc, desc = ORDER_DIR['ASC'] 494 else: 495 asc, desc = ORDER_DIR['DESC'] 490 496 for field in ordering: 491 497 if field == '?': … … 494 500 if isinstance(field, int): 495 501 if field < 0: 496 order = 'DESC'502 order = desc 497 503 field = -field 498 504 else: 499 order = 'ASC'505 order = asc 500 506 result.append('%s %s' % (field, order)) 501 507 continue … … 504 510 # on verbatim, after mapping the table name to an alias, if 505 511 # necessary. 506 col, order = get_order_dir(field )512 col, order = get_order_dir(field, asc) 507 513 table, col = col.split('.', 1) 508 514 elt = '%s.%s' % (qn(self.table_alias(table)[0]), col) … … 513 519 # '-field1__field2__field', etc. 514 520 for table, col, order in self.find_ordering_name(field, 515 self.model._meta ):521 self.model._meta, default_order=asc): 516 522 elt = '%s.%s' % (qn(table), qn(col)) 517 523 if not distinct or elt in select_aliases: 518 524 result.append('%s %s' % (elt, order)) 519 525 else: 520 col, order = get_order_dir(field )526 col, order = get_order_dir(field, asc) 521 527 elt = qn(col) 522 528 if not distinct or elt in select_aliases: django/branches/queryset-refactor/docs/db-api.txt
r7147 r7148 554 554 respect to case-sensitivity, Django will order results however your database 555 555 backend normally orders them. 556 557 ``reverse()`` 558 ~~~~~~~~~~~~~ 559 560 **New in Django development version** 561 562 If you want to reverse the order in which a queryset's elements are returned, 563 you can use the ``reverse()`` method. Calling ``reverse()`` a second time 564 restores the ordering back to the normal direction. 565 566 To retrieve the ''last'' five items in a queryset, you could do this:: 567 568 my_queryset.reverse()[:5] 569 570 Note that this is not quite the same as slicing from the end of a sequence in 571 Python. The above example will return the last item first, then the 572 penultimate item and so on. If we had a Python sequence and looked at 573 ``seq[:-5]``, we would see the fifth-last item first. Django doesn't support 574 that mode of access (slicing from the end), since it is not possible to do it 575 efficiently in SQL. 556 576 557 577 ``distinct()`` django/branches/queryset-refactor/tests/modeltests/ordering/models.py
r7124 r7148 49 49 [<Article: Article 1>, <Article: Article 3>, <Article: Article 2>, <Article: Article 4>] 50 50 51 # Only the last order_by has any effect (since they each override any previous 52 # ordering). 53 >>> Article.objects.order_by('id') 54 [<Article: Article 1>, <Article: Article 2>, <Article: Article 3>, <Article: Article 4>] 55 >>> Article.objects.order_by('id').order_by('-headline') 56 [<Article: Article 4>, <Article: Article 3>, <Article: Article 2>, <Article: Article 1>] 57 51 58 # Use the 'stop' part of slicing notation to limit the results. 52 59 >>> Article.objects.order_by('headline')[:2] … … 66 73 [...] 67 74 68 # order_by() overrides any previous ordering, so only the last one has any 69 # effect. 70 >>> Article.objects.order_by('id') 71 [<Article: Article 1>, <Article: Article 2>, <Article: Article 3>, <Article: Article 4>] 72 >>> Article.objects.order_by('id').order_by('-headline') 73 [<Article: Article 4>, <Article: Article 3>, <Article: Article 2>, <Article: Article 1>] 75 # Ordering can be reversed using the reverse() method on a queryset. This 76 # allows you to extract things like "the last two items" (reverse and then 77 # take the first two). 78 >>> Article.objects.all().reverse()[:2] 79 [<Article: Article 1>, <Article: Article 3>] 74 80 """} django/branches/queryset-refactor/tests/regressiontests/queries/models.py
r7046 r7148 318 318 >>> Item.objects.exclude(tags__name='t4').order_by('name').distinct() 319 319 [<Item: one>, <Item: three>, <Item: two>] 320 >>> Item.objects.exclude(tags__name='t4').order_by('name').distinct().reverse() 321 [<Item: two>, <Item: three>, <Item: one>] 320 322 >>> Author.objects.exclude(item__name='one').distinct().order_by('name') 321 323 [<Author: a2>, <Author: a3>, <Author: a4>]
