Skip to content

Commit 2fe8e8b

Browse files
committed
quote order_by field in SQL
1 parent e88145c commit 2fe8e8b

File tree

3 files changed

+15
-14
lines changed

3 files changed

+15
-14
lines changed

tests/testapp/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
class Model(TreeNode):
1010
custom_id = models.AutoField(primary_key=True)
11-
position = models.PositiveIntegerField(default=0)
11+
order = models.PositiveIntegerField(default=0)
1212
name = models.CharField(max_length=100)
1313

1414
class Meta:
15-
ordering = ("position",)
15+
ordering = ("order",)
1616

1717
def __str__(self):
1818
return self.name

tests/testapp/test_queries.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ class Test(TestCase):
3030
def create_tree(self):
3131
tree = type("Namespace", (), {})() # SimpleNamespace for PY2...
3232
tree.root = Model.objects.create(name="root")
33-
tree.child1 = Model.objects.create(parent=tree.root, position=0, name="1")
34-
tree.child2 = Model.objects.create(parent=tree.root, position=1, name="2")
35-
tree.child1_1 = Model.objects.create(parent=tree.child1, position=0, name="1-1")
36-
tree.child2_1 = Model.objects.create(parent=tree.child2, position=0, name="2-1")
37-
tree.child2_2 = Model.objects.create(parent=tree.child2, position=1, name="2-2")
33+
tree.child1 = Model.objects.create(parent=tree.root, order=0, name="1")
34+
tree.child2 = Model.objects.create(parent=tree.root, order=1, name="2")
35+
tree.child1_1 = Model.objects.create(parent=tree.child1, order=0, name="1-1")
36+
tree.child2_1 = Model.objects.create(parent=tree.child2, order=0, name="2-1")
37+
tree.child2_2 = Model.objects.create(parent=tree.child2, order=1, name="2-2")
3838
return tree
3939

4040
def test_stuff(self):
@@ -141,10 +141,10 @@ def test_annotate(self):
141141

142142
def test_update_aggregate(self):
143143
self.create_tree()
144-
Model.objects.with_tree_fields().update(position=3)
144+
Model.objects.with_tree_fields().update(order=3)
145145
self.assertEqual(
146-
Model.objects.with_tree_fields().aggregate(Sum("position")),
147-
{"position__sum": 18},
146+
Model.objects.with_tree_fields().aggregate(Sum("order")),
147+
{"order__sum": 18},
148148
# TODO Sum("tree_depth") does not work because the field is not
149149
# known yet.
150150
)
@@ -267,11 +267,11 @@ def test_string_ordering(self):
267267
)
268268

269269
def test_many_ordering(self):
270-
root = Model.objects.create(position=1, name="root")
270+
root = Model.objects.create(order=1, name="root")
271271
for i in range(20, 0, -1):
272-
Model.objects.create(parent=root, name=f"Node {i}", position=i * 10)
272+
Model.objects.create(parent=root, name=f"Node {i}", order=i * 10)
273273

274-
positions = [m.position for m in Model.objects.with_tree_fields()]
274+
positions = [m.order for m in Model.objects.with_tree_fields()]
275275
self.assertEqual(positions, list(sorted(positions)))
276276

277277
def test_bfs_ordering(self):

tree_queries/compiler.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from django.db.models.sql.compiler import SQLCompiler
55
from django.db.models.sql.query import Query
66

7-
87
SEPARATOR = "\x1f"
98

109

@@ -279,6 +278,8 @@ def as_sql(self, *args, **kwargs):
279278
if _ordered_by_integer(opts, params)
280279
else self.CTE_MYSQL_WITH_TEXT_ORDERING
281280
)
281+
if params["order_by"]:
282+
params["order_by"] = self.connection.ops.quote_name(params["order_by"])
282283
sql_0, sql_1 = super().as_sql(*args, **kwargs)
283284
explain = ""
284285
if sql_0.startswith("EXPLAIN "):

0 commit comments

Comments
 (0)