App Engine Python SDK version 1.7.4 (2)
[gae.git] / python / lib / django_1_4 / tests / modeltests / ordering / tests.py
blobb1b5253682e46b935d0c2f95d71b16d0a26b8e3b
1 from __future__ import absolute_import
3 from datetime import datetime
4 from operator import attrgetter
6 from django.test import TestCase
8 from .models import Article, ArticlePKOrdering
11 class OrderingTests(TestCase):
12 def test_basic(self):
13 a1 = Article.objects.create(
14 headline="Article 1", pub_date=datetime(2005, 7, 26)
16 a2 = Article.objects.create(
17 headline="Article 2", pub_date=datetime(2005, 7, 27)
19 a3 = Article.objects.create(
20 headline="Article 3", pub_date=datetime(2005, 7, 27)
22 a4 = Article.objects.create(
23 headline="Article 4", pub_date=datetime(2005, 7, 28)
26 # By default, Article.objects.all() orders by pub_date descending, then
27 # headline ascending.
28 self.assertQuerysetEqual(
29 Article.objects.all(), [
30 "Article 4",
31 "Article 2",
32 "Article 3",
33 "Article 1",
35 attrgetter("headline")
38 # Override ordering with order_by, which is in the same format as the
39 # ordering attribute in models.
40 self.assertQuerysetEqual(
41 Article.objects.order_by("headline"), [
42 "Article 1",
43 "Article 2",
44 "Article 3",
45 "Article 4",
47 attrgetter("headline")
49 self.assertQuerysetEqual(
50 Article.objects.order_by("pub_date", "-headline"), [
51 "Article 1",
52 "Article 3",
53 "Article 2",
54 "Article 4",
56 attrgetter("headline")
59 # Only the last order_by has any effect (since they each override any
60 # previous ordering).
61 self.assertQuerysetEqual(
62 Article.objects.order_by("id"), [
63 "Article 1",
64 "Article 2",
65 "Article 3",
66 "Article 4",
68 attrgetter("headline")
70 self.assertQuerysetEqual(
71 Article.objects.order_by("id").order_by("-headline"), [
72 "Article 4",
73 "Article 3",
74 "Article 2",
75 "Article 1",
77 attrgetter("headline")
80 # Use the 'stop' part of slicing notation to limit the results.
81 self.assertQuerysetEqual(
82 Article.objects.order_by("headline")[:2], [
83 "Article 1",
84 "Article 2",
86 attrgetter("headline")
89 # Use the 'stop' and 'start' parts of slicing notation to offset the
90 # result list.
91 self.assertQuerysetEqual(
92 Article.objects.order_by("headline")[1:3], [
93 "Article 2",
94 "Article 3",
96 attrgetter("headline")
99 # Getting a single item should work too:
100 self.assertEqual(Article.objects.all()[0], a4)
102 # Use '?' to order randomly.
103 self.assertEqual(
104 len(list(Article.objects.order_by("?"))), 4
107 # Ordering can be reversed using the reverse() method on a queryset.
108 # This allows you to extract things like "the last two items" (reverse
109 # and then take the first two).
110 self.assertQuerysetEqual(
111 Article.objects.all().reverse()[:2], [
112 "Article 1",
113 "Article 3",
115 attrgetter("headline")
118 # Ordering can be based on fields included from an 'extra' clause
119 self.assertQuerysetEqual(
120 Article.objects.extra(select={"foo": "pub_date"}, order_by=["foo", "headline"]), [
121 "Article 1",
122 "Article 2",
123 "Article 3",
124 "Article 4",
126 attrgetter("headline")
129 # If the extra clause uses an SQL keyword for a name, it will be
130 # protected by quoting.
131 self.assertQuerysetEqual(
132 Article.objects.extra(select={"order": "pub_date"}, order_by=["order", "headline"]), [
133 "Article 1",
134 "Article 2",
135 "Article 3",
136 "Article 4",
138 attrgetter("headline")
141 def test_order_by_pk(self):
143 Ensure that 'pk' works as an ordering option in Meta.
144 Refs #8291.
146 a1 = ArticlePKOrdering.objects.create(
147 pk=1, headline="Article 1", pub_date=datetime(2005, 7, 26)
149 a2 = ArticlePKOrdering.objects.create(
150 pk=2, headline="Article 2", pub_date=datetime(2005, 7, 27)
152 a3 = ArticlePKOrdering.objects.create(
153 pk=3, headline="Article 3", pub_date=datetime(2005, 7, 27)
155 a4 = ArticlePKOrdering.objects.create(
156 pk=4, headline="Article 4", pub_date=datetime(2005, 7, 28)
159 self.assertQuerysetEqual(
160 ArticlePKOrdering.objects.all(), [
161 "Article 4",
162 "Article 3",
163 "Article 2",
164 "Article 1",
166 attrgetter("headline")