Merge pull request #1069 from mfogel/ticket_20413

Fixed #20413 - Respect Query.get_meta()
This commit is contained in:
Alex Gaynor 2013-05-15 13:15:19 -07:00
commit c0c3b65de9
5 changed files with 25 additions and 25 deletions

View File

@ -121,7 +121,7 @@ class GeoSQLCompiler(compiler.SQLCompiler):
""" """
result = [] result = []
if opts is None: if opts is None:
opts = self.query.model._meta opts = self.get_meta()
aliases = set() aliases = set()
only_load = self.deferred_to_columns() only_load = self.deferred_to_columns()
seen = self.query.included_inherited_models.copy() seen = self.query.included_inherited_models.copy()
@ -247,7 +247,7 @@ class GeoSQLCompiler(compiler.SQLCompiler):
used. If `column` is specified, it will be used instead of the value used. If `column` is specified, it will be used instead of the value
in `field.column`. in `field.column`.
""" """
if table_alias is None: table_alias = self.query.model._meta.db_table if table_alias is None: table_alias = self.get_meta().db_table
return "%s.%s" % (self.quote_name_unless_alias(table_alias), return "%s.%s" % (self.quote_name_unless_alias(table_alias),
self.connection.ops.quote_name(column or field.column)) self.connection.ops.quote_name(column or field.column))

View File

@ -869,7 +869,7 @@ class QuerySet(object):
""" """
if self.query.extra_order_by or self.query.order_by: if self.query.extra_order_by or self.query.order_by:
return True return True
elif self.query.default_ordering and self.query.model._meta.ordering: elif self.query.default_ordering and self.query.get_meta().ordering:
return True return True
else: else:
return False return False

View File

@ -32,7 +32,7 @@ class SQLCompiler(object):
# cleaned. We are not using a clone() of the query here. # cleaned. We are not using a clone() of the query here.
""" """
if not self.query.tables: if not self.query.tables:
self.query.join((None, self.query.model._meta.db_table, None)) self.query.join((None, self.query.get_meta().db_table, None))
if (not self.query.select and self.query.default_cols and not if (not self.query.select and self.query.default_cols and not
self.query.included_inherited_models): self.query.included_inherited_models):
self.query.setup_inherited_models() self.query.setup_inherited_models()
@ -260,7 +260,7 @@ class SQLCompiler(object):
""" """
result = [] result = []
if opts is None: if opts is None:
opts = self.query.model._meta opts = self.query.get_meta()
qn = self.quote_name_unless_alias qn = self.quote_name_unless_alias
qn2 = self.connection.ops.quote_name qn2 = self.connection.ops.quote_name
aliases = set() aliases = set()
@ -309,7 +309,7 @@ class SQLCompiler(object):
qn = self.quote_name_unless_alias qn = self.quote_name_unless_alias
qn2 = self.connection.ops.quote_name qn2 = self.connection.ops.quote_name
result = [] result = []
opts = self.query.model._meta opts = self.query.get_meta()
for name in self.query.distinct_fields: for name in self.query.distinct_fields:
parts = name.split(LOOKUP_SEP) parts = name.split(LOOKUP_SEP)
@ -338,7 +338,7 @@ class SQLCompiler(object):
ordering = self.query.order_by ordering = self.query.order_by
else: else:
ordering = (self.query.order_by ordering = (self.query.order_by
or self.query.model._meta.ordering or self.query.get_meta().ordering
or []) or [])
qn = self.quote_name_unless_alias qn = self.quote_name_unless_alias
qn2 = self.connection.ops.quote_name qn2 = self.connection.ops.quote_name
@ -388,7 +388,7 @@ class SQLCompiler(object):
# 'col' is of the form 'field' or 'field1__field2' or # 'col' is of the form 'field' or 'field1__field2' or
# '-field1__field2__field', etc. # '-field1__field2__field', etc.
for table, cols, order in self.find_ordering_name(field, for table, cols, order in self.find_ordering_name(field,
self.query.model._meta, default_order=asc): self.query.get_meta(), default_order=asc):
for col in cols: for col in cols:
if (table, col) not in processed_pairs: if (table, col) not in processed_pairs:
elt = '%s.%s' % (qn(table), qn2(col)) elt = '%s.%s' % (qn(table), qn2(col))
@ -556,10 +556,10 @@ class SQLCompiler(object):
select_cols = self.query.select + self.query.related_select_cols select_cols = self.query.select + self.query.related_select_cols
# Just the column, not the fields. # Just the column, not the fields.
select_cols = [s[0] for s in select_cols] select_cols = [s[0] for s in select_cols]
if (len(self.query.model._meta.concrete_fields) == len(self.query.select) if (len(self.query.get_meta().concrete_fields) == len(self.query.select)
and self.connection.features.allows_group_by_pk): and self.connection.features.allows_group_by_pk):
self.query.group_by = [ self.query.group_by = [
(self.query.model._meta.db_table, self.query.model._meta.pk.column) (self.query.get_meta().db_table, self.query.get_meta().pk.column)
] ]
select_cols = [] select_cols = []
seen = set() seen = set()
@ -716,14 +716,14 @@ class SQLCompiler(object):
if self.query.select: if self.query.select:
fields = [f.field for f in self.query.select] fields = [f.field for f in self.query.select]
else: else:
fields = self.query.model._meta.concrete_fields fields = self.query.get_meta().concrete_fields
fields = fields + [f.field for f in self.query.related_select_cols] fields = fields + [f.field for f in self.query.related_select_cols]
# If the field was deferred, exclude it from being passed # If the field was deferred, exclude it from being passed
# into `resolve_columns` because it wasn't selected. # into `resolve_columns` because it wasn't selected.
only_load = self.deferred_to_columns() only_load = self.deferred_to_columns()
if only_load: if only_load:
db_table = self.query.model._meta.db_table db_table = self.query.get_meta().db_table
fields = [f for f in fields if db_table in only_load and fields = [f for f in fields if db_table in only_load and
f.column in only_load[db_table]] f.column in only_load[db_table]]
row = self.resolve_columns(row, fields) row = self.resolve_columns(row, fields)
@ -825,7 +825,7 @@ class SQLInsertCompiler(SQLCompiler):
# We don't need quote_name_unless_alias() here, since these are all # We don't need quote_name_unless_alias() here, since these are all
# going to be column names (so we can avoid the extra overhead). # going to be column names (so we can avoid the extra overhead).
qn = self.connection.ops.quote_name qn = self.connection.ops.quote_name
opts = self.query.model._meta opts = self.query.get_meta()
result = ['INSERT INTO %s' % qn(opts.db_table)] result = ['INSERT INTO %s' % qn(opts.db_table)]
has_fields = bool(self.query.fields) has_fields = bool(self.query.fields)
@ -887,7 +887,7 @@ class SQLInsertCompiler(SQLCompiler):
if self.connection.features.can_return_id_from_insert: if self.connection.features.can_return_id_from_insert:
return self.connection.ops.fetch_returned_insert_id(cursor) return self.connection.ops.fetch_returned_insert_id(cursor)
return self.connection.ops.last_insert_id(cursor, return self.connection.ops.last_insert_id(cursor,
self.query.model._meta.db_table, self.query.model._meta.pk.column) self.query.get_meta().db_table, self.query.get_meta().pk.column)
class SQLDeleteCompiler(SQLCompiler): class SQLDeleteCompiler(SQLCompiler):
@ -992,7 +992,7 @@ class SQLUpdateCompiler(SQLCompiler):
query.bump_prefix() query.bump_prefix()
query.extra = {} query.extra = {}
query.select = [] query.select = []
query.add_fields([query.model._meta.pk.name]) query.add_fields([query.get_meta().pk.name])
# Recheck the count - it is possible that fiddling with the select # Recheck the count - it is possible that fiddling with the select
# fields above removes tables from the query. Refs #18304. # fields above removes tables from the query. Refs #18304.
count = query.count_active_tables() count = query.count_active_tables()

View File

@ -552,7 +552,7 @@ class Query(object):
field_names, defer = self.deferred_loading field_names, defer = self.deferred_loading
if not field_names: if not field_names:
return return
orig_opts = self.model._meta orig_opts = self.get_meta()
seen = {} seen = {}
must_include = {orig_opts.concrete_model: set([orig_opts.pk])} must_include = {orig_opts.concrete_model: set([orig_opts.pk])}
for field_name in field_names: for field_name in field_names:
@ -818,7 +818,7 @@ class Query(object):
alias = self.tables[0] alias = self.tables[0]
self.ref_alias(alias) self.ref_alias(alias)
else: else:
alias = self.join((None, self.model._meta.db_table, None)) alias = self.join((None, self.get_meta().db_table, None))
return alias return alias
def count_active_tables(self): def count_active_tables(self):
@ -906,7 +906,7 @@ class Query(object):
whereas column determination is a later part, and side-effect, of whereas column determination is a later part, and side-effect, of
as_sql()). as_sql()).
""" """
opts = self.model._meta opts = self.get_meta()
root_alias = self.tables[0] root_alias = self.tables[0]
seen = {None: root_alias} seen = {None: root_alias}
@ -1624,7 +1624,7 @@ class Query(object):
"Cannot add count col with multiple cols in 'select': %r" % self.select "Cannot add count col with multiple cols in 'select': %r" % self.select
count = self.aggregates_module.Count(self.select[0].col) count = self.aggregates_module.Count(self.select[0].col)
else: else:
opts = self.model._meta opts = self.get_meta()
if not self.select: if not self.select:
count = self.aggregates_module.Count( count = self.aggregates_module.Count(
(self.join((None, opts.db_table, None)), opts.pk.column), (self.join((None, opts.db_table, None)), opts.pk.column),
@ -1732,7 +1732,7 @@ class Query(object):
field_names = set(field_names) field_names = set(field_names)
if 'pk' in field_names: if 'pk' in field_names:
field_names.remove('pk') field_names.remove('pk')
field_names.add(self.model._meta.pk.name) field_names.add(self.get_meta().pk.name)
if defer: if defer:
# Remove any existing deferred names from the current set before # Remove any existing deferred names from the current set before

View File

@ -41,12 +41,12 @@ class DeleteQuery(Query):
lot of values in pk_list. lot of values in pk_list.
""" """
if not field: if not field:
field = self.model._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):
where = self.where_class() where = self.where_class()
where.add((Constraint(None, field.column, field), 'in', where.add((Constraint(None, field.column, field), 'in',
pk_list[offset:offset + GET_ITERATOR_CHUNK_SIZE]), AND) pk_list[offset:offset + GET_ITERATOR_CHUNK_SIZE]), AND)
self.do_query(self.model._meta.db_table, where, using=using) self.do_query(self.get_meta().db_table, where, using=using)
def delete_qs(self, query, using): def delete_qs(self, query, using):
""" """
@ -112,7 +112,7 @@ class UpdateQuery(Query):
related_updates=self.related_updates.copy(), **kwargs) related_updates=self.related_updates.copy(), **kwargs)
def update_batch(self, pk_list, values, using): def update_batch(self, pk_list, values, using):
pk_field = self.model._meta.pk pk_field = self.get_meta().pk
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.where = self.where_class()
@ -129,7 +129,7 @@ class UpdateQuery(Query):
""" """
values_seq = [] values_seq = []
for name, val in six.iteritems(values): for name, val in six.iteritems(values):
field, model, direct, m2m = self.model._meta.get_field_by_name(name) field, model, direct, m2m = self.get_meta().get_field_by_name(name)
if not direct or m2m: if not direct or m2m:
raise FieldError('Cannot update model field %r (only non-relations and foreign keys permitted).' % field) raise FieldError('Cannot update model field %r (only non-relations and foreign keys permitted).' % field)
if model: if model:
@ -236,7 +236,7 @@ class DateQuery(Query):
) )
except FieldError: except FieldError:
raise FieldDoesNotExist("%s has no field named '%s'" % ( raise FieldDoesNotExist("%s has no field named '%s'" % (
self.model._meta.object_name, field_name self.get_meta().object_name, field_name
)) ))
field = result[0] field = result[0]
self._check_field(field) # overridden in DateTimeQuery self._check_field(field) # overridden in DateTimeQuery