summaryrefslogtreecommitdiff
path: root/tests/ordering
diff options
context:
space:
mode:
authorVIZZARD-X <vigneshanandmay13@gmail.com>2026-01-10 02:26:37 +0530
committerJacob Walls <jacobtylerwalls@gmail.com>2026-02-13 16:58:36 -0500
commit08b4dfc5734f5d2fce685eabcd65385a6656db2f (patch)
tree468d1e7db12407c049e892181eb3ac3866b3ab05 /tests/ordering
parent3dea5fed077e33c7d8bca4b5eeade5420cb05d27 (diff)
Fixed #36857 -- Added QuerySet.totally_ordered property.
Thanks Simon Charette for the idea.
Diffstat (limited to 'tests/ordering')
-rw-r--r--tests/ordering/models.py29
-rw-r--r--tests/ordering/tests.py49
2 files changed, 75 insertions, 3 deletions
diff --git a/tests/ordering/models.py b/tests/ordering/models.py
index c365da7642..a4e4b82d40 100644
--- a/tests/ordering/models.py
+++ b/tests/ordering/models.py
@@ -59,6 +59,7 @@ class ChildArticle(Article):
class Reference(models.Model):
article = models.ForeignKey(OrderedByAuthorArticle, models.CASCADE)
+ proof = models.OneToOneField(Article, models.CASCADE, related_name="+")
class Meta:
ordering = ("article",)
@@ -80,3 +81,31 @@ class OrderedByExpressionChild(models.Model):
class OrderedByExpressionGrandChild(models.Model):
parent = models.ForeignKey(OrderedByExpressionChild, models.CASCADE)
+
+
+class BarcodedArticle(models.Model):
+ rank = models.IntegerField(unique=True, null=True)
+ headline = models.CharField(max_length=100)
+ slug = models.CharField(max_length=100, default="slug")
+ pub_date = models.DateField(null=True)
+ barcode = models.CharField(max_length=30, default="bar")
+
+ class Meta:
+ required_db_features = {"supports_partial_indexes"}
+ unique_together = (("headline", "slug"),)
+ constraints = [
+ models.UniqueConstraint(
+ fields=["pub_date", "rank"],
+ name="unique_pub_date_rank",
+ ),
+ models.UniqueConstraint(
+ fields=["rank"],
+ condition=models.Q(rank__gt=0),
+ name="unique_rank_conditional",
+ ),
+ models.UniqueConstraint(
+ fields=["barcode"],
+ condition=models.Q(),
+ name="unique_barcode_empty_condition",
+ ),
+ ]
diff --git a/tests/ordering/tests.py b/tests/ordering/tests.py
index 008f0239b3..c4ffc7a89d 100644
--- a/tests/ordering/tests.py
+++ b/tests/ordering/tests.py
@@ -18,11 +18,12 @@ from django.db.models import (
When,
)
from django.db.models.functions import Length, Upper
-from django.test import TestCase
+from django.test import SimpleTestCase, TestCase
from .models import (
Article,
Author,
+ BarcodedArticle,
ChildArticle,
OrderedByExpression,
OrderedByExpressionChild,
@@ -583,8 +584,8 @@ class OrderingTests(TestCase):
self.a2.author = second_author
self.a2.second_author = first_author
self.a2.save()
- r1 = Reference.objects.create(article_id=self.a1.pk)
- r2 = Reference.objects.create(article_id=self.a2.pk)
+ r1 = Reference.objects.create(article_id=self.a1.pk, proof_id=self.a1.pk)
+ r2 = Reference.objects.create(article_id=self.a2.pk, proof_id=self.a2.pk)
self.assertSequenceEqual(Reference.objects.all(), [r2, r1])
def test_default_ordering_by_f_expression(self):
@@ -688,3 +689,45 @@ class OrderingTests(TestCase):
F("num").desc(), "pk"
)
self.assertCountEqual(qs, qs.iterator())
+
+
+class TotallyOrderedTests(SimpleTestCase):
+ def test_basic_ordering(self):
+ self.assertIs(Author.objects.all().totally_ordered, True)
+ self.assertIs(Author.objects.order_by("name").totally_ordered, False)
+ self.assertIs(BarcodedArticle.objects.order_by("rank").totally_ordered, False)
+ self.assertIs(
+ BarcodedArticle.objects.order_by("rank", "pk").totally_ordered, True
+ )
+
+ def test_composite_constraints(self):
+ qs = BarcodedArticle.objects.order_by("pub_date", "rank")
+ self.assertIs(qs.totally_ordered, False)
+ qs = BarcodedArticle.objects.order_by("headline", "slug")
+ self.assertIs(qs.totally_ordered, True)
+
+ def test_reverse_ordering(self):
+ self.assertIs(Author.objects.order_by("-pk").totally_ordered, True)
+
+ def test_f_expressions(self):
+ self.assertIs(Author.objects.order_by(F("pk")).totally_ordered, True)
+ self.assertIs(Author.objects.order_by(F("name")).totally_ordered, False)
+
+ def test_one_to_one_relation(self):
+ qs = Reference.objects.order_by("proof")
+ self.assertIs(qs.totally_ordered, False)
+ qs = Reference.objects.order_by("proof_id")
+ self.assertIs(qs.totally_ordered, True)
+
+ def test_relation_traversal(self):
+ self.assertIs(Article.objects.order_by("author__pk").totally_ordered, False)
+
+ def test_conditional_constraints(self):
+ self.assertIs(BarcodedArticle.objects.order_by("rank").totally_ordered, False)
+ self.assertIs(BarcodedArticle.objects.order_by("barcode").totally_ordered, True)
+
+ def test_totally_ordered_none(self):
+ qs = Author.objects.order_by().none()
+ self.assertIs(qs.totally_ordered, False)
+ qs = Author.objects.order_by("pk").none()
+ self.assertIs(qs.totally_ordered, True)