|
| 1 | +import operator |
| 2 | +from datetime import timedelta |
1 | 3 | from decimal import Decimal
|
2 | 4 |
|
3 | 5 | from django.core.exceptions import FieldDoesNotExist, ValidationError
|
4 |
| - |
| 6 | +from django.db.models import ExpressionWrapper, F, IntegerField, Max, Model, Sum |
5 | 7 | from django.test import SimpleTestCase, TestCase
|
6 | 8 |
|
7 | 9 | from django_mongodb.fields import EmbeddedModelField
|
@@ -182,3 +184,48 @@ def test_embedded_with_json_field(self):
|
182 | 184 | ),
|
183 | 185 | models[1:3],
|
184 | 186 | )
|
| 187 | + |
| 188 | + @staticmethod |
| 189 | + def _truncate_ms(time): |
| 190 | + return time - timedelta(microseconds=time.microsecond) |
| 191 | + |
| 192 | + ################ |
| 193 | + def test_ordering_by_embedded_field(self): |
| 194 | + query = ( |
| 195 | + EmbeddedModelFieldModel.objects.filter(simple__someint__gt=3) |
| 196 | + .order_by("-simple__someint") |
| 197 | + .values("pk") |
| 198 | + ) |
| 199 | + expected = [{"pk": e.pk} for e in list(reversed(self.objs[4:]))] |
| 200 | + self.assertSequenceEqual(query, expected) |
| 201 | + |
| 202 | + def test_ordering_grouping_by_embedded_field(self): |
| 203 | + query = ( |
| 204 | + EmbeddedModelFieldModel.objects.annotate( |
| 205 | + group=ExpressionWrapper(F("simple__someint") + 5, output_field=IntegerField()) |
| 206 | + ) |
| 207 | + .values("group") |
| 208 | + .annotate(max_pk=Max("simple__auto_now")) |
| 209 | + .order_by("simple__someint") |
| 210 | + ) |
| 211 | + query = [{**e, "max_pk": self._truncate_ms(e["max_pk"])} for e in query] |
| 212 | + expected = [ |
| 213 | + EmbeddedModelFieldModel.objects.create(simple=EmbeddedModel(someint=x)) |
| 214 | + for x in range(6) |
| 215 | + ] |
| 216 | + self.assertSequenceEqual( |
| 217 | + query, |
| 218 | + [ |
| 219 | + {"group": e.simple.someint + 5, "max_pk": self._truncate_ms(e.simple.auto_now)} |
| 220 | + for e in expected |
| 221 | + ], |
| 222 | + ) |
| 223 | + |
| 224 | + def test_ordering_grouping_by_sum(self): |
| 225 | + [EmbeddedModelFieldModel.objects.create(simple=EmbeddedModel(someint=x)) for x in range(6)] |
| 226 | + qs = ( |
| 227 | + EmbeddedModelFieldModel.objects.values("simple__someint") |
| 228 | + .annotate(sum=Sum("simple__someint")) |
| 229 | + .order_by("sum") |
| 230 | + ) |
| 231 | + self.assertQuerySetEqual(qs, [0, 2, 4, 6, 8, 10], operator.itemgetter("sum")) |
0 commit comments