diff options
| author | Gagaro <gagaro42@gmail.com> | 2022-01-31 15:51:38 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-03-16 09:33:16 +0100 |
| commit | bf524d229f3c1008f41450e2750b85395aa75fe6 (patch) | |
| tree | 9ba097a0230f9fd818ca07907fcdb2429b9221a1 /django/db/models/sql | |
| parent | 970f5bf5035d8c99b0ff883f984b60cf531dddbe (diff) | |
Refs #30581 -- Allowed sql.Query to be used without model.
Diffstat (limited to 'django/db/models/sql')
| -rw-r--r-- | django/db/models/sql/compiler.py | 13 | ||||
| -rw-r--r-- | django/db/models/sql/query.py | 13 |
2 files changed, 19 insertions, 7 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 28d412e11a..ce2787b6c0 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -310,8 +310,8 @@ class SQLCompiler: ordering = self.query.order_by elif self.query.order_by: ordering = self.query.order_by - elif self.query.get_meta().ordering: - ordering = self.query.get_meta().ordering + elif (meta := self.query.get_meta()) and meta.ordering: + ordering = meta.ordering self._meta_ordering = ordering else: ordering = [] @@ -645,7 +645,11 @@ class SQLCompiler: params.extend(s_params) out_cols.append(s_sql) - result += [", ".join(out_cols), "FROM", *from_] + result += [", ".join(out_cols)] + if from_: + result += ["FROM", *from_] + elif self.connection.features.bare_select_suffix: + result += [self.connection.features.bare_select_suffix] params.extend(f_params) if self.query.select_for_update and features.has_select_for_update: @@ -796,7 +800,8 @@ class SQLCompiler: """ result = [] if opts is None: - opts = self.query.get_meta() + if (opts := self.query.get_meta()) is None: + return result only_load = self.deferred_to_columns() start_alias = start_alias or self.query.get_initial_alias() # The 'seen_models' is used to optimize checking the needed parent diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 31a66cec46..54f3258eac 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -46,6 +46,8 @@ __all__ = ["Query", "RawQuery"] def get_field_names_from_opts(opts): + if opts is None: + return set() return set( chain.from_iterable( (f.name, f.attname) if f.concrete else (f.name,) for f in opts.get_fields() @@ -301,7 +303,8 @@ class Query(BaseExpression): processing. Normally, this is self.model._meta, but it can be changed by subclasses. """ - return self.model._meta + if self.model: + return self.model._meta def clone(self): """ @@ -994,8 +997,10 @@ class Query(BaseExpression): if self.alias_map: alias = self.base_table self.ref_alias(alias) - else: + elif self.model: alias = self.join(self.base_table_class(self.get_meta().db_table, None)) + else: + alias = None return alias def count_active_tables(self): @@ -1619,6 +1624,8 @@ class Query(BaseExpression): field = None filtered_relation = None try: + if opts is None: + raise FieldDoesNotExist field = opts.get_field(name) except FieldDoesNotExist: if name in self.annotation_select: @@ -1673,7 +1680,7 @@ class Query(BaseExpression): # Check if we need any joins for concrete inheritance cases (the # field lives in parent, but we are currently in one of its # children) - if model is not opts.model: + if opts is not None and model is not opts.model: path_to_parent = opts.get_path_to_parent(model) if path_to_parent: path.extend(path_to_parent) |
