1
0
mirror of https://github.com/django/django.git synced 2025-06-05 11:39:13 +00:00

Fixed #32951 -- Removed Query.where_class & co.

Unused since 3caf957ed5eaa831a485abcb89f27266dbf3e82b.
This commit is contained in:
Nick Pope 2021-07-20 20:38:17 +01:00 committed by Mariusz Felisiak
parent 012f38f959
commit c35b81b864
10 changed files with 29 additions and 25 deletions

View File

@ -15,6 +15,7 @@ from django.db.models.fields.related import (
) )
from django.db.models.query_utils import PathInfo from django.db.models.query_utils import PathInfo
from django.db.models.sql import AND from django.db.models.sql import AND
from django.db.models.sql.where import WhereNode
from django.utils.functional import cached_property from django.utils.functional import cached_property
@ -466,11 +467,11 @@ class GenericRelation(ForeignObject):
return ContentType.objects.get_for_model(self.model, return ContentType.objects.get_for_model(self.model,
for_concrete_model=self.for_concrete_model) for_concrete_model=self.for_concrete_model)
def get_extra_restriction(self, where_class, alias, remote_alias): def get_extra_restriction(self, alias, remote_alias):
field = self.remote_field.model._meta.get_field(self.content_type_field_name) field = self.remote_field.model._meta.get_field(self.content_type_field_name)
contenttype_pk = self.get_content_type().pk contenttype_pk = self.get_content_type().pk
lookup = field.get_lookup('exact')(field.get_col(remote_alias), contenttype_pk) lookup = field.get_lookup('exact')(field.get_col(remote_alias), contenttype_pk)
return where_class([lookup], connector=AND) return WhereNode([lookup], connector=AND)
def bulk_related_objects(self, objs, using=DEFAULT_DB_ALIAS): def bulk_related_objects(self, objs, using=DEFAULT_DB_ALIAS):
""" """

View File

@ -711,7 +711,7 @@ class ForeignObject(RelatedField):
""" """
return {} return {}
def get_extra_restriction(self, where_class, alias, related_alias): def get_extra_restriction(self, alias, related_alias):
""" """
Return a pair condition used for joining and subquery pushdown. The Return a pair condition used for joining and subquery pushdown. The
condition is something that responds to as_sql(compiler, connection) condition is something that responds to as_sql(compiler, connection)

View File

@ -164,8 +164,8 @@ class ForeignObjectRel(FieldCacheMixin):
def get_joining_columns(self): def get_joining_columns(self):
return self.field.get_reverse_joining_columns() return self.field.get_reverse_joining_columns()
def get_extra_restriction(self, where_class, alias, related_alias): def get_extra_restriction(self, alias, related_alias):
return self.field.get_extra_restriction(where_class, related_alias, alias) return self.field.get_extra_restriction(related_alias, alias)
def set_field_name(self): def set_field_name(self):
""" """

View File

@ -1504,7 +1504,6 @@ class SQLDeleteCompiler(SQLCompiler):
pk.get_col(self.query.get_initial_alias()) pk.get_col(self.query.get_initial_alias())
] ]
outerq = Query(self.query.model) outerq = Query(self.query.model)
outerq.where = self.query.where_class()
if not self.connection.features.update_can_self_select: if not self.connection.features.update_can_self_select:
# Force the materialization of the inner query to allow reference # Force the materialization of the inner query to allow reference
# to the target table on MySQL. # to the target table on MySQL.
@ -1626,7 +1625,7 @@ class SQLUpdateCompiler(SQLCompiler):
# Now we adjust the current query: reset the where clause and get rid # Now we adjust the current query: reset the where clause and get rid
# of all the tables we don't need (since they're in the sub-select). # of all the tables we don't need (since they're in the sub-select).
self.query.where = self.query.where_class() self.query.clear_where()
if self.query.related_updates or must_pre_select: if self.query.related_updates or must_pre_select:
# Either we're using the idents in multiple update queries (so # Either we're using the idents in multiple update queries (so
# don't want them to change), or the db backend doesn't support # don't want them to change), or the db backend doesn't support

View File

@ -78,8 +78,7 @@ class Join:
# Add a single condition inside parentheses for whatever # Add a single condition inside parentheses for whatever
# get_extra_restriction() returns. # get_extra_restriction() returns.
extra_cond = self.join_field.get_extra_restriction( extra_cond = self.join_field.get_extra_restriction(self.table_alias, self.parent_alias)
compiler.query.where_class, self.table_alias, self.parent_alias)
if extra_cond: if extra_cond:
extra_sql, extra_params = compiler.compile(extra_cond) extra_sql, extra_params = compiler.compile(extra_cond)
join_conditions.append('(%s)' % extra_sql) join_conditions.append('(%s)' % extra_sql)

View File

@ -144,7 +144,7 @@ class Query(BaseExpression):
compiler = 'SQLCompiler' compiler = 'SQLCompiler'
def __init__(self, model, where=WhereNode, alias_cols=True): def __init__(self, model, alias_cols=True):
self.model = model self.model = model
self.alias_refcount = {} self.alias_refcount = {}
# alias_map is the most important data structure regarding joins. # alias_map is the most important data structure regarding joins.
@ -175,8 +175,7 @@ class Query(BaseExpression):
# clause to contain other than default fields (values(), subqueries...) # clause to contain other than default fields (values(), subqueries...)
# Note that annotations go to annotations dictionary. # Note that annotations go to annotations dictionary.
self.select = () self.select = ()
self.where = where() self.where = WhereNode()
self.where_class = where
# The group_by attribute can have one of the following forms: # The group_by attribute can have one of the following forms:
# - None: no group by at all in the query # - None: no group by at all in the query
# - A tuple of expressions: group by (at least) those expressions. # - A tuple of expressions: group by (at least) those expressions.
@ -1265,7 +1264,7 @@ class Query(BaseExpression):
condition = filter_expr.resolve_expression(self, allow_joins=allow_joins) condition = filter_expr.resolve_expression(self, allow_joins=allow_joins)
if not isinstance(condition, Lookup): if not isinstance(condition, Lookup):
condition = self.build_lookup(['exact'], condition, True) condition = self.build_lookup(['exact'], condition, True)
return self.where_class([condition], connector=AND), [] return WhereNode([condition], connector=AND), []
arg, value = filter_expr arg, value = filter_expr
if not arg: if not arg:
raise FieldError("Cannot parse keyword query %r" % arg) raise FieldError("Cannot parse keyword query %r" % arg)
@ -1286,7 +1285,7 @@ class Query(BaseExpression):
if reffed_expression: if reffed_expression:
condition = self.build_lookup(lookups, reffed_expression, value) condition = self.build_lookup(lookups, reffed_expression, value)
return self.where_class([condition], connector=AND), [] return WhereNode([condition], connector=AND), []
opts = self.get_meta() opts = self.get_meta()
alias = self.get_initial_alias() alias = self.get_initial_alias()
@ -1329,7 +1328,7 @@ class Query(BaseExpression):
condition = self.build_lookup(lookups, col, value) condition = self.build_lookup(lookups, col, value)
lookup_type = condition.lookup_name lookup_type = condition.lookup_name
clause = self.where_class([condition], connector=AND) clause = WhereNode([condition], connector=AND)
require_outer = lookup_type == 'isnull' and condition.rhs is True and not current_negated require_outer = lookup_type == 'isnull' and condition.rhs is True and not current_negated
if current_negated and (lookup_type != 'isnull' or condition.rhs is False) and condition.rhs is not None: if current_negated and (lookup_type != 'isnull' or condition.rhs is False) and condition.rhs is not None:
@ -1381,6 +1380,9 @@ class Query(BaseExpression):
def build_where(self, filter_expr): def build_where(self, filter_expr):
return self.build_filter(filter_expr, allow_joins=False)[0] return self.build_filter(filter_expr, allow_joins=False)[0]
def clear_where(self):
self.where = WhereNode()
def _add_q(self, q_object, used_aliases, branch_negated=False, def _add_q(self, q_object, used_aliases, branch_negated=False,
current_negated=False, allow_joins=True, split_subq=True, current_negated=False, allow_joins=True, split_subq=True,
check_filterable=True): check_filterable=True):
@ -1388,8 +1390,7 @@ class Query(BaseExpression):
connector = q_object.connector connector = q_object.connector
current_negated = current_negated ^ q_object.negated current_negated = current_negated ^ q_object.negated
branch_negated = branch_negated or q_object.negated branch_negated = branch_negated or q_object.negated
target_clause = self.where_class(connector=connector, target_clause = WhereNode(connector=connector, negated=q_object.negated)
negated=q_object.negated)
joinpromoter = JoinPromoter(q_object.connector, len(q_object.children), current_negated) joinpromoter = JoinPromoter(q_object.connector, len(q_object.children), current_negated)
for child in q_object.children: for child in q_object.children:
child_clause, needed_inner = self.build_filter( child_clause, needed_inner = self.build_filter(
@ -1408,7 +1409,7 @@ class Query(BaseExpression):
connector = q_object.connector connector = q_object.connector
current_negated ^= q_object.negated current_negated ^= q_object.negated
branch_negated = branch_negated or q_object.negated branch_negated = branch_negated or q_object.negated
target_clause = self.where_class(connector=connector, negated=q_object.negated) target_clause = WhereNode(connector=connector, negated=q_object.negated)
for child in q_object.children: for child in q_object.children:
if isinstance(child, Node): if isinstance(child, Node):
child_clause = self.build_filtered_relation_q( child_clause = self.build_filtered_relation_q(
@ -2301,8 +2302,7 @@ class Query(BaseExpression):
select_fields = [r[0] for r in join_field.related_fields] select_fields = [r[0] for r in join_field.related_fields]
select_alias = lookup_tables[trimmed_paths + 1] select_alias = lookup_tables[trimmed_paths + 1]
self.unref_alias(lookup_tables[trimmed_paths]) self.unref_alias(lookup_tables[trimmed_paths])
extra_restriction = join_field.get_extra_restriction( extra_restriction = join_field.get_extra_restriction(None, lookup_tables[trimmed_paths + 1])
self.where_class, None, lookup_tables[trimmed_paths + 1])
if extra_restriction: if extra_restriction:
self.where.add(extra_restriction, AND) self.where.add(extra_restriction, AND)
else: else:

View File

@ -37,7 +37,7 @@ class DeleteQuery(Query):
num_deleted = 0 num_deleted = 0
field = self.get_meta().pk field = self.get_meta().pk
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
self.where = self.where_class() self.clear_where()
self.add_q(Q( self.add_q(Q(
**{field.attname + '__in': pk_list[offset:offset + GET_ITERATOR_CHUNK_SIZE]})) **{field.attname + '__in': pk_list[offset:offset + GET_ITERATOR_CHUNK_SIZE]}))
num_deleted += self.do_query(self.get_meta().db_table, self.where, using=using) num_deleted += self.do_query(self.get_meta().db_table, self.where, using=using)
@ -70,7 +70,7 @@ class UpdateQuery(Query):
def update_batch(self, pk_list, values, using): def update_batch(self, pk_list, values, using):
self.add_update_values(values) self.add_update_values(values)
for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
self.where = self.where_class() self.clear_where()
self.add_q(Q(pk__in=pk_list[offset: offset + GET_ITERATOR_CHUNK_SIZE])) self.add_q(Q(pk__in=pk_list[offset: offset + GET_ITERATOR_CHUNK_SIZE]))
self.get_compiler(using).execute_sql(NO_RESULTS) self.get_compiler(using).execute_sql(NO_RESULTS)

View File

@ -504,6 +504,11 @@ Miscellaneous
individual nodes to a string. ``Node.render()`` should always return a string individual nodes to a string. ``Node.render()`` should always return a string
as documented. as documented.
* The ``where_class`` property of ``django.db.models.sql.query.Query`` and the
``where_class`` argument to the private ``get_extra_restriction()`` method of
``ForeignObject`` and ``ForeignObjectRel`` are removed. If needed, initialize
``django.db.models.sql.where.WhereNode`` instead.
.. _deprecated-features-4.0: .. _deprecated-features-4.0:
Features deprecated in 4.0 Features deprecated in 4.0

View File

@ -32,7 +32,7 @@ class ActiveTranslationField(models.ForeignObject):
""" """
requires_unique_target = False requires_unique_target = False
def get_extra_restriction(self, where_class, alias, related_alias): def get_extra_restriction(self, alias, related_alias):
return ColConstraint(alias, 'lang', get_language()) return ColConstraint(alias, 'lang', get_language())
def get_extra_descriptor_filter(self, instance): def get_extra_descriptor_filter(self, instance):

View File

@ -43,7 +43,7 @@ class StartsWithRelation(models.ForeignObject):
""" """
return self.remote_field return self.remote_field
def get_extra_restriction(self, where_class, alias, related_alias): def get_extra_restriction(self, alias, related_alias):
to_field = self.remote_field.model._meta.get_field(self.to_fields[0]) to_field = self.remote_field.model._meta.get_field(self.to_fields[0])
from_field = self.model._meta.get_field(self.from_fields[0]) from_field = self.model._meta.get_field(self.from_fields[0])
return StartsWith(to_field.get_col(alias), from_field.get_col(related_alias)) return StartsWith(to_field.get_col(alias), from_field.get_col(related_alias))
@ -87,7 +87,7 @@ class BrokenContainsRelation(StartsWithRelation):
This model is designed to yield no join conditions and This model is designed to yield no join conditions and
raise an exception in ``Join.as_sql()``. raise an exception in ``Join.as_sql()``.
""" """
def get_extra_restriction(self, where_class, alias, related_alias): def get_extra_restriction(self, alias, related_alias):
return None return None