diff options
| author | VIZZARD-X <vigneshanandmay13@gmail.com> | 2026-01-10 02:26:37 +0530 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2026-02-13 16:58:36 -0500 |
| commit | 08b4dfc5734f5d2fce685eabcd65385a6656db2f (patch) | |
| tree | 468d1e7db12407c049e892181eb3ac3866b3ab05 /tests/ordering | |
| parent | 3dea5fed077e33c7d8bca4b5eeade5420cb05d27 (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.py | 29 | ||||
| -rw-r--r-- | tests/ordering/tests.py | 49 |
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) |
