From 88009b9e990b0d43279e4ec53ce2cbaf26af2eb8 Mon Sep 17 00:00:00 2001 From: Pietro Brenna Date: Thu, 17 Mar 2022 11:14:51 +0100 Subject: [PATCH] Enable returning a qs (to allow query parameters) --- dbview/helpers.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/dbview/helpers.py b/dbview/helpers.py index 3298932..f81e33a 100644 --- a/dbview/helpers.py +++ b/dbview/helpers.py @@ -2,6 +2,7 @@ import logging from django.db import migrations from django.apps import apps +from django.db.models import QuerySet class CreateView(migrations.CreateModel): @@ -56,14 +57,20 @@ class CreateView(migrations.CreateModel): schema_editor.execute(sql, None) def _create_standard_view(self, model, schema_editor): - sql_template = 'CREATE VIEW %(table)s AS %(definition)s' - qs = str(model.view()) - args = { - 'table': schema_editor.quote_name(model._meta.db_table), - 'definition': qs, - } - sql = sql_template % args - self._create_view_from_raw_sql(sql, schema_editor) + sql_template = 'CREATE VIEW %(table)s AS ' % {'table': schema_editor.quote_name(model._meta.db_table)} + params = [] + qs = model.view() + if isinstance(qs, QuerySet): + db = qs.db + compiler = qs.query.get_compiler(using=db) + sql, qs_params = qs.query.as_sql(compiler, schema_editor.connection) + sql_template += sql + params += qs_params + elif isinstance(qs, str): + sql_template += qs + else: + raise Exception('view() should return a string or a QuerySet') + self._create_view_from_raw_sql(sql_template, schema_editor, params=params) - def _create_view_from_raw_sql(self, sql, schema_editor): - schema_editor.execute(sql, None) + def _create_view_from_raw_sql(self, sql, schema_editor, params=None): + schema_editor.execute(sql, params)