|
| 1 | +from datetime import datetime, timezone |
| 2 | + |
1 | 3 | from django.db import connection, models |
2 | | -from django.db.models import Case, F, Q, Value, When |
| 4 | +from django.db.models import Case, F, Min, Q, Value, When |
| 5 | +from django.db.models.functions.datetime import TruncSecond |
3 | 6 | from django.test.utils import CaptureQueriesContext, override_settings |
4 | 7 |
|
5 | 8 | from psqlextra.expressions import HStoreRef |
@@ -96,6 +99,40 @@ def test_query_annotate_in_expression(): |
96 | 99 | assert result.is_he_henk == "really henk" |
97 | 100 |
|
98 | 101 |
|
| 102 | +def test_query_annotate_group_by(): |
| 103 | + """Tests whether annotations with GROUP BY clauses are properly renamed |
| 104 | + when the annotation overwrites a field name.""" |
| 105 | + |
| 106 | + model = get_fake_model( |
| 107 | + { |
| 108 | + "name": models.TextField(), |
| 109 | + "timestamp": models.DateTimeField(null=False), |
| 110 | + "value": models.IntegerField(), |
| 111 | + } |
| 112 | + ) |
| 113 | + |
| 114 | + timestamp = datetime(2024, 1, 1, 0, 0, 0, 0, tzinfo=timezone.utc) |
| 115 | + |
| 116 | + model.objects.create(name="me", timestamp=timestamp, value=1) |
| 117 | + |
| 118 | + result = ( |
| 119 | + model.objects.values("name") |
| 120 | + .annotate( |
| 121 | + timestamp=TruncSecond("timestamp", tzinfo=timezone.utc), |
| 122 | + value=Min("value"), |
| 123 | + ) |
| 124 | + .values_list( |
| 125 | + "name", |
| 126 | + "value", |
| 127 | + "timestamp", |
| 128 | + ) |
| 129 | + .order_by("name") |
| 130 | + .first() |
| 131 | + ) |
| 132 | + |
| 133 | + assert result == ("me", 1, timestamp) |
| 134 | + |
| 135 | + |
99 | 136 | def test_query_hstore_value_update_f_ref(): |
100 | 137 | """Tests whether F(..) expressions can be used in hstore values when |
101 | 138 | performing update queries.""" |
|
0 commit comments