from django.db.models.base import ModelBase from django.db import connection from django.db import models from django.db.models.fields.files import ImageFieldFile class SafeImageFieldFile(ImageFieldFile): @property def width(self): try: return self.width except: return None @property def height(self): try: return self.height except: return None class SafeImageField(models.ImageField): attr_class = SafeImageFieldFile class ModelFieldsNames(object): def __init__(self, model): self.alias = None self._meta = model._meta def __getattr__(self, name): alias = '__as__' if name.startswith(alias): self.alias = name[len(alias):] return '%s as %s' % (self._meta.db_table, self.alias) field = self._meta.get_field(name).get_attname_column()[1] if self.alias: return u"%s.%s" % (self.alias, field) else: return u"%s.%s" % (self._meta.db_table, field) def __str__(self): return '%s' % self._meta.db_table def format_sql(sql, **kwargs): for name, value in kwargs.items(): if issubclass(type(value), ModelBase): kwargs[name] = ModelFieldsNames(value) elif isinstance(value, (tuple, list)): kwargs[name] = ','.join(map(lambda x: repr(x) if isinstance(x, str) else str(x), value)) elif not isinstance(value, str): kwargs[name] = value return sql.format(**kwargs) def execute_sql(sql, args=()): cursor = connection.cursor() cursor.execute(sql, args) return cursor.fetchall()