mirror of
https://github.com/django/django.git
synced 2025-04-08 15:36:47 +00:00
Refs #16055 -- Removed get_joining_columns()/get_reverse_joining_columns() methods per deprecation timeline.
This commit is contained in:
parent
9a3f86e960
commit
0a0f9b4acc
@ -1,6 +1,5 @@
|
||||
import functools
|
||||
import inspect
|
||||
import warnings
|
||||
from functools import partial
|
||||
|
||||
from django import forms
|
||||
@ -14,7 +13,6 @@ from django.db.models.constants import LOOKUP_SEP
|
||||
from django.db.models.deletion import CASCADE, SET_DEFAULT, SET_NULL
|
||||
from django.db.models.query_utils import PathInfo
|
||||
from django.db.models.utils import make_model_tuple
|
||||
from django.utils.deprecation import RemovedInDjango60Warning
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
@ -817,27 +815,6 @@ class ForeignObject(RelatedField):
|
||||
attname, column = super().get_attname_column()
|
||||
return attname, None
|
||||
|
||||
def get_joining_columns(self, reverse_join=False):
|
||||
warnings.warn(
|
||||
"ForeignObject.get_joining_columns() is deprecated. Use "
|
||||
"get_joining_fields() instead.",
|
||||
RemovedInDjango60Warning,
|
||||
stacklevel=2,
|
||||
)
|
||||
source = self.reverse_related_fields if reverse_join else self.related_fields
|
||||
return tuple(
|
||||
(lhs_field.column, rhs_field.column) for lhs_field, rhs_field in source
|
||||
)
|
||||
|
||||
def get_reverse_joining_columns(self):
|
||||
warnings.warn(
|
||||
"ForeignObject.get_reverse_joining_columns() is deprecated. Use "
|
||||
"get_reverse_joining_fields() instead.",
|
||||
RemovedInDjango60Warning,
|
||||
stacklevel=2,
|
||||
)
|
||||
return self.get_joining_columns(reverse_join=True)
|
||||
|
||||
def get_joining_fields(self, reverse_join=False):
|
||||
return tuple(
|
||||
self.reverse_related_fields if reverse_join else self.related_fields
|
||||
|
@ -9,10 +9,7 @@ They also act as reverse fields for the purposes of the Meta API because
|
||||
they're the closest concept currently available.
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
from django.core import exceptions
|
||||
from django.utils.deprecation import RemovedInDjango60Warning
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.hashable import make_hashable
|
||||
|
||||
@ -192,15 +189,6 @@ class ForeignObjectRel(FieldCacheMixin):
|
||||
qs = qs.order_by(*ordering)
|
||||
return (blank_choice if include_blank else []) + [(x.pk, str(x)) for x in qs]
|
||||
|
||||
def get_joining_columns(self):
|
||||
warnings.warn(
|
||||
"ForeignObjectRel.get_joining_columns() is deprecated. Use "
|
||||
"get_joining_fields() instead.",
|
||||
RemovedInDjango60Warning,
|
||||
stacklevel=2,
|
||||
)
|
||||
return self.field.get_reverse_joining_columns()
|
||||
|
||||
def get_joining_fields(self):
|
||||
return self.field.get_reverse_joining_fields()
|
||||
|
||||
|
@ -3,11 +3,8 @@ Useful auxiliary data structures for query construction. Not useful outside
|
||||
the SQL domain.
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
from django.core.exceptions import FullResultSet
|
||||
from django.db.models.sql.constants import INNER, LOUTER
|
||||
from django.utils.deprecation import RemovedInDjango60Warning
|
||||
|
||||
|
||||
class MultiJoin(Exception):
|
||||
@ -65,20 +62,11 @@ class Join:
|
||||
self.join_type = join_type
|
||||
# A list of 2-tuples to use in the ON clause of the JOIN.
|
||||
# Each 2-tuple will create one join condition in the ON clause.
|
||||
if hasattr(join_field, "get_joining_fields"):
|
||||
self.join_fields = join_field.get_joining_fields()
|
||||
self.join_cols = tuple(
|
||||
(lhs_field.column, rhs_field.column)
|
||||
for lhs_field, rhs_field in self.join_fields
|
||||
)
|
||||
else:
|
||||
warnings.warn(
|
||||
"The usage of get_joining_columns() in Join is deprecated. Implement "
|
||||
"get_joining_fields() instead.",
|
||||
RemovedInDjango60Warning,
|
||||
)
|
||||
self.join_fields = None
|
||||
self.join_cols = join_field.get_joining_columns()
|
||||
self.join_fields = join_field.get_joining_fields()
|
||||
self.join_cols = tuple(
|
||||
(lhs_field.column, rhs_field.column)
|
||||
for lhs_field, rhs_field in self.join_fields
|
||||
)
|
||||
# Along which field (or ForeignObjectRel in the reverse join case)
|
||||
self.join_field = join_field
|
||||
# Is this join nullabled?
|
||||
@ -94,25 +82,15 @@ class Join:
|
||||
join_conditions = []
|
||||
params = []
|
||||
qn = compiler.quote_name_unless_alias
|
||||
qn2 = connection.ops.quote_name
|
||||
# Add a join condition for each pair of joining columns.
|
||||
# RemovedInDjango60Warning: when the depraction ends, replace with:
|
||||
# for lhs, rhs in self.join_field:
|
||||
join_fields = self.join_fields or self.join_cols
|
||||
for lhs, rhs in join_fields:
|
||||
if isinstance(lhs, str):
|
||||
# RemovedInDjango60Warning: when the depraction ends, remove
|
||||
# the branch for strings.
|
||||
lhs_full_name = "%s.%s" % (qn(self.parent_alias), qn2(lhs))
|
||||
rhs_full_name = "%s.%s" % (qn(self.table_alias), qn2(rhs))
|
||||
else:
|
||||
lhs, rhs = connection.ops.prepare_join_on_clause(
|
||||
self.parent_alias, lhs, self.table_alias, rhs
|
||||
)
|
||||
lhs_sql, lhs_params = compiler.compile(lhs)
|
||||
lhs_full_name = lhs_sql % lhs_params
|
||||
rhs_sql, rhs_params = compiler.compile(rhs)
|
||||
rhs_full_name = rhs_sql % rhs_params
|
||||
for lhs, rhs in self.join_fields:
|
||||
lhs, rhs = connection.ops.prepare_join_on_clause(
|
||||
self.parent_alias, lhs, self.table_alias, rhs
|
||||
)
|
||||
lhs_sql, lhs_params = compiler.compile(lhs)
|
||||
lhs_full_name = lhs_sql % lhs_params
|
||||
rhs_sql, rhs_params = compiler.compile(rhs)
|
||||
rhs_full_name = rhs_sql % rhs_params
|
||||
join_conditions.append(f"{lhs_full_name} = {rhs_full_name}")
|
||||
|
||||
# Add a single condition inside parentheses for whatever
|
||||
|
@ -273,6 +273,14 @@ to remove usage of these features.
|
||||
|
||||
* The ``FORMS_URLFIELD_ASSUME_HTTPS`` transitional setting is removed.
|
||||
|
||||
* The ``django.db.models.sql.datastructures.Join`` no longer fallback to
|
||||
``get_joining_columns()``.
|
||||
|
||||
* The ``get_joining_columns()`` method of ``ForeignObject`` and
|
||||
``ForeignObjectRel`` is removed.
|
||||
|
||||
* The ``ForeignObject.get_reverse_joining_columns()`` method is be removed.
|
||||
|
||||
See :ref:`deprecated-features-5.1` for details on these changes, including how
|
||||
to remove usage of these features.
|
||||
|
||||
|
@ -8,7 +8,6 @@ from django.db import models
|
||||
from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
|
||||
from django.test.utils import isolate_apps
|
||||
from django.utils import translation
|
||||
from django.utils.deprecation import RemovedInDjango60Warning
|
||||
|
||||
from .models import (
|
||||
Article,
|
||||
@ -712,52 +711,3 @@ class TestCachedPathInfo(TestCase):
|
||||
foreign_object_restored = pickle.loads(pickle.dumps(foreign_object))
|
||||
self.assertIn("path_infos", foreign_object_restored.__dict__)
|
||||
self.assertIn("reverse_path_infos", foreign_object_restored.__dict__)
|
||||
|
||||
|
||||
class GetJoiningDeprecationTests(TestCase):
|
||||
def test_foreign_object_get_joining_columns_warning(self):
|
||||
msg = (
|
||||
"ForeignObject.get_joining_columns() is deprecated. Use "
|
||||
"get_joining_fields() instead."
|
||||
)
|
||||
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
|
||||
Membership.person.field.get_joining_columns()
|
||||
self.assertEqual(ctx.filename, __file__)
|
||||
|
||||
def test_foreign_object_get_reverse_joining_columns_warning(self):
|
||||
msg = (
|
||||
"ForeignObject.get_reverse_joining_columns() is deprecated. Use "
|
||||
"get_reverse_joining_fields() instead."
|
||||
)
|
||||
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
|
||||
Membership.person.field.get_reverse_joining_columns()
|
||||
self.assertEqual(ctx.filename, __file__)
|
||||
|
||||
def test_foreign_object_rel_get_joining_columns_warning(self):
|
||||
msg = (
|
||||
"ForeignObjectRel.get_joining_columns() is deprecated. Use "
|
||||
"get_joining_fields() instead."
|
||||
)
|
||||
with self.assertWarnsMessage(RemovedInDjango60Warning, msg) as ctx:
|
||||
Membership.person.field.remote_field.get_joining_columns()
|
||||
self.assertEqual(ctx.filename, __file__)
|
||||
|
||||
def test_join_get_joining_columns_warning(self):
|
||||
class CustomForeignKey(models.ForeignKey):
|
||||
def __getattribute__(self, attr):
|
||||
if attr == "get_joining_fields":
|
||||
raise AttributeError
|
||||
return super().__getattribute__(attr)
|
||||
|
||||
class CustomParent(models.Model):
|
||||
value = models.CharField(max_length=255)
|
||||
|
||||
class CustomChild(models.Model):
|
||||
links = CustomForeignKey(CustomParent, models.CASCADE)
|
||||
|
||||
msg = (
|
||||
"The usage of get_joining_columns() in Join is deprecated. Implement "
|
||||
"get_joining_fields() instead."
|
||||
)
|
||||
with self.assertWarnsMessage(RemovedInDjango60Warning, msg):
|
||||
CustomChild.objects.filter(links__value="value")
|
||||
|
Loading…
x
Reference in New Issue
Block a user