def get_related_where(self, fk_name, using, type): qn = self.get_quote_name(using) related_where = [ "%s = %s.%s" % (qn(self.model._meta.pk.get_attname_column()[1]), type, qn(fk_name)) ] related_query = Query(self.manager.related.model) for name, value in self.filter.iteritems(): related_query.add_q(Q(**{name: value})) for name, value in self.exclude.iteritems(): related_query.add_q(~Q(**{name: value})) related_query.add_extra(None, None, [ "%s = %s.%s" % (qn(self.model._meta.pk.get_attname_column()[1]), type, qn(self.manager.related.field.m2m_column_name())) ], None, None, None) related_query.add_count_column() related_query.clear_ordering(force_empty=True) related_query.default_cols = False related_filter_where, related_where_params = related_query.get_compiler( using=using).as_sql() if related_filter_where is not None: related_where.append('(' + related_filter_where + ') > 0') return related_where, related_where_params
def get_related_where(self, fk_name, using, type): qn = self.get_quote_name(using) related_where = ["%s = %s.%s" % (qn(self.model._meta.pk.get_attname_column()[1]), type, qn(fk_name))] related_query = Query(self.manager.related.model) for name, value in self.filter.iteritems(): related_query.add_q(Q(**{name: value})) for name, value in self.exclude.iteritems(): related_query.add_q(~Q(**{name: value})) related_query.add_extra( None, None, [ "%s = %s.%s" % ( qn(self.model._meta.pk.get_attname_column()[1]), type, qn(self.manager.related.field.m2m_column_name()), ) ], None, None, None, ) related_query.add_count_column() related_query.clear_ordering(force_empty=True) related_query.default_cols = False related_filter_where, related_where_params = related_query.get_compiler(using=using).as_sql() if related_filter_where is not None: related_where.append("(" + related_filter_where + ") > 0") return related_where, related_where_params
def _get_condition_sql(self, model, schema_editor): if self.condition is None: return None query = Query(model=model, alias_cols=False) where = query.build_where(self.condition) compiler = query.get_compiler(connection=schema_editor.connection) sql, params = where.as_sql(compiler, schema_editor.connection) return sql % tuple(schema_editor.quote_value(p) for p in params)
def _get_condition_sql(self, model, schema_editor): if self.condition is None: return None query = Query(model=model) where = query.build_where(self.condition) compiler = query.get_compiler(connection=schema_editor.connection) sql, params = where.as_sql(compiler, schema_editor.connection) return sql % tuple(schema_editor.quote_value(p) for p in params)
def test_q_annotation(self): query = Query(None) check = ExpressionWrapper( Q(RawSQL("%s IS NULL", (None, ), BooleanField())) | Q(Exists(Item.objects.all())), BooleanField(), ) query.add_annotation(check, "_check") result = query.get_compiler(using=DEFAULT_DB_ALIAS).execute_sql(SINGLE) self.assertEqual(result[0], 1)
def test_rawsql_annotation(self): query = Query(None) sql = "%s IS NULL" # Wrap with a CASE WHEN expression if a database backend (e.g. Oracle) # doesn't support boolean expression in SELECT list. if not connection.features.supports_boolean_expr_in_select_clause: sql = f"CASE WHEN {sql} THEN 1 ELSE 0 END" query.add_annotation(RawSQL(sql, (None, ), BooleanField()), "_check") result = query.get_compiler(using=DEFAULT_DB_ALIAS).execute_sql(SINGLE) self.assertEqual(result[0], 1)
def get_related_decrement_value(self, using): qn = self.get_quote_name(using) related_query = Query(self.manager.related.model) related_query.add_extra(None, None, ["%s = %s.%s" % (qn(self.model._meta.pk.get_attname_column()[1]), 'OLD', qn(self.manager.related.field.m2m_column_name()))], None, None, None) related_query.add_fields([self.fieldname]) related_query.clear_ordering(force_empty=True) related_query.default_cols = False related_filter_where, related_where_params = related_query.get_compiler(using=using).as_sql() return "%s - (%s)" % (qn(self.fieldname), related_filter_where)
def get_related_decrement_value(self, using): qn = self.get_quote_name(using) related_query = Query(self.manager.related.model) related_query.add_extra(None, None, [ "%s = %s.%s" % (qn(self.model._meta.pk.get_attname_column()[1]), 'OLD', qn(self.manager.related.field.m2m_column_name())) ], None, None, None) related_query.add_fields([self.fieldname]) related_query.clear_ordering(force_empty=True) related_query.default_cols = False related_filter_where, related_where_params = related_query.get_compiler( using=using).as_sql() return "%s - (%s)" % (qn(self.fieldname), related_filter_where)
def _get_check_sql(self, model, schema_editor): query = Query(model=model) where = query.build_where(self.check) compiler = query.get_compiler(connection=schema_editor.connection) sql, params = where.as_sql(compiler, schema_editor.connection) return sql % tuple(schema_editor.quote_value(p) for p in params)
def test_subquery_annotation(self): query = Query(None) query.add_annotation(Exists(Item.objects.all()), "_check") result = query.get_compiler(using=DEFAULT_DB_ALIAS).execute_sql(SINGLE) self.assertEqual(result[0], 0)