1
0
mirror of https://github.com/django/django.git synced 2025-01-09 09:55:57 +00:00

Merge branch 'fix_outerref_orderby' of https://github.com/AyushKhatri-Dev/django into fix_outerref_orderby

This commit is contained in:
Ayush khatri 2024-12-15 17:44:04 +05:30
commit 4075aa9674
2 changed files with 6 additions and 36 deletions

View File

@ -123,6 +123,7 @@ class JSONFieldModel(models.Model):
class Meta: class Meta:
required_db_features = {"supports_json_field"} required_db_features = {"supports_json_field"}
class NamedCategory(models.Model): class NamedCategory(models.Model):
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)

View File

@ -6,7 +6,6 @@ from collections import namedtuple
from copy import deepcopy from copy import deepcopy
from decimal import Decimal from decimal import Decimal
from unittest import mock from unittest import mock
from .models import NamedCategory
from django.core.exceptions import FieldError from django.core.exceptions import FieldError
from django.db import DatabaseError, NotSupportedError, connection from django.db import DatabaseError, NotSupportedError, connection
@ -82,6 +81,7 @@ from .models import (
Employee, Employee,
Experiment, Experiment,
Manager, Manager,
NamedCategory,
Number, Number,
RemoteEmployee, RemoteEmployee,
Result, Result,
@ -2852,38 +2852,6 @@ class OrderByTests(SimpleTestCase):
F("field").desc(nulls_last=False) F("field").desc(nulls_last=False)
class OuterRefOrderByTestCase(TestCase):
@classmethod
def setUpTestData(cls):
cls.ceo = Employee.objects.create(
firstname="John", lastname="Doe", salary=100000
)
cls.gmbh = Company.objects.create(
name="GmbH",
num_employees=50,
ceo=cls.ceo,
point_of_contact=cls.ceo,
based_in_eu=True,
)
cls.foobar_ltd = Company.objects.create(
name="Foobar Ltd",
num_employees=100,
ceo=cls.ceo,
point_of_contact=cls.ceo,
based_in_eu=False,
)
def test_order_by_with_outerref(self):
inner = Company.objects.filter(
num_employees__lt=OuterRef("num_employees")
).order_by("num_employees")
qs = Company.objects.annotate(next_bigger=Subquery(inner.values("pk")[:1]))
foobar_ltd = qs.get(pk=self.foobar_ltd.pk)
self.assertIsNotNone(foobar_ltd.next_bigger)
self.assertEqual(foobar_ltd.next_bigger, self.gmbh.pk)
class SubqueryTests(TestCase): class SubqueryTests(TestCase):
def test_outer_ref_order_by(self): def test_outer_ref_order_by(self):
NamedCategory.objects.create(id=1, name="first") NamedCategory.objects.create(id=1, name="first")
@ -2893,14 +2861,15 @@ class SubqueryTests(TestCase):
outer_query = NamedCategory.objects.all() outer_query = NamedCategory.objects.all()
subquery = ( subquery = (
NamedCategory.objects.filter(id=OuterRef("id")) NamedCategory.objects.filter(pk=OuterRef("pk"))
.order_by("name") .order_by("pk")
.values("name") .values("name")
) )
values = outer_query.annotate(sorted_name=Subquery(subquery)).order_by( values = outer_query.annotate(sorted_name=Subquery(subquery)).order_by(
"sorted_name" "sorted_name"
) )
sorted_names = list(values.values_list("sorted_name", flat=True)) sorted_names = list(values.values_list("sorted_name", flat=True))
self.assertListEqual(sorted_names, ["first", "fourth", "second", "third"]) self.assertListEqual(sorted_names, ["first", "fourth", "second", "third"])