diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 14bc791d0..5bd7a10b9 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,6 +15,7 @@ Changelog Fixed ^^^^^ - Fix model with multi m2m fields generates wrong references name (#1897) +- Fix using reserved words in order_by (#1900) 0.24.1 ------ diff --git a/tests/test_order_by.py b/tests/test_order_by.py index 24015fcef..8f8f1c051 100644 --- a/tests/test_order_by.py +++ b/tests/test_order_by.py @@ -10,7 +10,7 @@ from tortoise.contrib.test.condition import NotEQ from tortoise.exceptions import ConfigurationError, FieldError from tortoise.expressions import Case, Q, When -from tortoise.functions import Count, Sum +from tortoise.functions import Count, Lower, Sum class TestOrderBy(test.TestCase): @@ -95,6 +95,16 @@ async def test_order_by_aggregation_reversed(self): ) self.assertEqual([t.name for t in tournaments], ["1", "2"]) + async def test_order_by_reserved_word_annotation(self): + await Tournament.create(name="1") + await Tournament.create(name="2") + + reserved_words = ["order", "group", "limit", "offset", "where"] + + for word in reserved_words: + tournaments = await Tournament.annotate(**{word: Lower("name")}).order_by(word) + self.assertEqual([t.name for t in tournaments], ["1", "2"]) + async def test_distinct_values_with_annotation(self): await Tournament.create(name="3") await Tournament.create(name="1") @@ -115,7 +125,7 @@ async def test_distinct_values_with_annotation(self): ) self.assertEqual([t["name"] for t in tournaments], ["1", "2", "3"]) - async def test_distinct_all_withl_annotation(self): + async def test_distinct_all_with_annotation(self): await Tournament.create(name="3") await Tournament.create(name="1") await Tournament.create(name="2") diff --git a/tortoise/queryset.py b/tortoise/queryset.py index b289d1dcd..3bb938d4c 100644 --- a/tortoise/queryset.py +++ b/tortoise/queryset.py @@ -9,7 +9,7 @@ from pypika_tortoise.analytics import Count from pypika_tortoise.functions import Cast from pypika_tortoise.queries import QueryBuilder -from pypika_tortoise.terms import Case, Field, PseudoColumn, Star, Term, ValueWrapper +from pypika_tortoise.terms import Case, Field, Star, Term, ValueWrapper from typing_extensions import Literal, Protocol from tortoise.backends.base.client import BaseDBAsyncClient, Capabilities @@ -223,7 +223,7 @@ def resolve_ordering( # - Empty fields_for_select means that all columns and annotations are selected, # hence we can reference the annotation. # - The annotation is in fields_for_select, hence we can reference it. - term = PseudoColumn(field_name) + term = Field(field_name) else: # The annotation is not in SELECT, resolve it annotation = annotations[field_name]