Пример #1
0
    def get_db_prep_lookup(self, lookup_type, value):
        "Returns field's value prepared for database lookup."
        if hasattr(value, 'as_sql'):
            sql, params = value.as_sql()
            return QueryWrapper(('(%s)' % sql), params)
        if lookup_type in ('regex', 'iregex', 'month', 'day', 'search'):
            return [value]
        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
            return [self.get_db_prep_value(value)]
        elif lookup_type in ('range', 'in'):
            return [self.get_db_prep_value(v) for v in value]
        elif lookup_type in ('contains', 'icontains'):
            return ["%%%s%%" % connection.ops.prep_for_like_query(value)]
        elif lookup_type == 'iexact':
            return [connection.ops.prep_for_iexact_query(value)]
        elif lookup_type in ('startswith', 'istartswith'):
            return ["%s%%" % connection.ops.prep_for_like_query(value)]
        elif lookup_type in ('endswith', 'iendswith'):
            return ["%%%s" % connection.ops.prep_for_like_query(value)]
        elif lookup_type == 'isnull':
            return []
        elif lookup_type == 'year':
            try:
                value = int(value)
            except ValueError:
                raise ValueError(
                    "The __year lookup type requires an integer argument")

            if self.get_internal_type() == 'DateField':
                return connection.ops.year_lookup_bounds_for_date_field(value)
            else:
                return connection.ops.year_lookup_bounds(value)

        raise TypeError("Field has invalid lookup: %s" % lookup_type)
Пример #2
0
    def get_db_prep_lookup(self, lookup_type, value):
        # If we are doing a lookup on a Related Field, we must be
        # comparing object instances. The value should be the PK of value,
        # not value itself.
        def pk_trace(value):
            # Value may be a primary key, or an object held in a relation.
            # If it is an object, then we need to get the primary key value for
            # that object. In certain conditions (especially one-to-one relations),
            # the primary key may itself be an object - so we need to keep drilling
            # down until we hit a value that can be used for a comparison.
            v = value
            try:
                while True:
                    v = getattr(v, v._meta.pk.name)
            except AttributeError:
                pass
            return v

        if hasattr(value, 'as_sql'):
            sql, params = value.as_sql()
            return QueryWrapper(('(%s)' % sql), params)
        if lookup_type == 'exact':
            return [pk_trace(value)]
        if lookup_type == 'in':
            return [pk_trace(v) for v in value]
        elif lookup_type == 'isnull':
            return []
        raise TypeError, "Related Field has invalid lookup: %s" % lookup_type
Пример #3
0
 def hupdate(self, query, attr, updates):
     """
     Updates the specified hstore.
     """
     value = QueryWrapper('"%s" || %%s' % attr, [updates])
     field, model, direct, m2m = self.model._meta.get_field_by_name(attr)
     query.add_update_fields([(field, None, value)])
     return query
Пример #4
0
 def hremove(self, query, attr, keys):
     """
     Removes the specified keys in the specified hstore.
     """
     value = QueryWrapper('delete("%s", %%s)' % attr, [keys])
     field, model, direct, m2m = self.model._meta.get_field_by_name(attr)
     query.add_update_fields([(field, None, value)])
     return query
Пример #5
0
 def hremove(self, query, attr, keys):
     """
     Removes the specified keys in the specified hstore.
     """
     value = QueryWrapper('delete("%s", %%s)' % attr, [keys])
     field = get_field(self, attr)
     query.add_update_fields([(field, None, value)])
     return query
Пример #6
0
    def get_db_prep_lookup(self,
                           lookup_type,
                           value,
                           connection,
                           prepared=False):
        """
        Returns field's value prepared for database lookup.
        """
        if not prepared:
            value = self.get_prep_lookup(lookup_type, value)
        if hasattr(value, 'get_compiler'):
            value = value.get_compiler(connection=connection)
        if hasattr(value, 'as_sql') or hasattr(value, '_as_sql'):
            # If the value has a relabel_aliases method, it will need to
            # be invoked before the final SQL is evaluated
            if hasattr(value, 'relabel_aliases'):
                return value
            if hasattr(value, 'as_sql'):
                sql, params = value.as_sql()
            else:
                sql, params = value._as_sql(connection=connection)
            return QueryWrapper(('(%s)' % sql), params)

        if lookup_type in ('month', 'day', 'week_day', 'hour', 'minute',
                           'second', 'search', 'regex', 'iregex'):
            return [value]
        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
            return [
                self.get_db_prep_value(value,
                                       connection=connection,
                                       prepared=prepared)
            ]
        elif lookup_type in ('range', 'in'):
            return [
                self.get_db_prep_value(v,
                                       connection=connection,
                                       prepared=prepared) for v in value
            ]
        elif lookup_type in ('contains', 'icontains'):
            return ["%%%s%%" % connection.ops.prep_for_like_query(value)]
        elif lookup_type == 'iexact':
            return [connection.ops.prep_for_iexact_query(value)]
        elif lookup_type in ('startswith', 'istartswith'):
            return ["%s%%" % connection.ops.prep_for_like_query(value)]
        elif lookup_type in ('endswith', 'iendswith'):
            return ["%%%s" % connection.ops.prep_for_like_query(value)]
        elif lookup_type == 'isnull':
            return []
        elif lookup_type == 'year':
            if isinstance(self, DateTimeField):
                return connection.ops.year_lookup_bounds_for_datetime_field(
                    value)
            elif isinstance(self, DateField):
                return connection.ops.year_lookup_bounds_for_date_field(value)
            else:
                return [value]  # this isn't supposed to happen
Пример #7
0
 def hupdate(self, query, attr, updates):
     """
     Updates the specified hstore.
     """
     field = get_field(self, attr)
     if hasattr(field, 'serializer'):
         updates = field.get_prep_value(updates)
     value = QueryWrapper('"%s" || %%s' % attr, [updates])
     query.add_update_fields([(field, None, value)])
     return query
Пример #8
0
 def hupdate(self, query, attr, updates):
     """
     Updates the specified hstore.
     """
     field, model, direct, m2m = self.model._meta.get_field_by_name(attr)
     if hasattr(field, 'serializer'):
         updates = field.get_prep_value(updates)
     value = QueryWrapper('"%s" || %%s' % attr, [updates])
     query.add_update_fields([(field, None, value)])
     return query
Пример #9
0
    def as_subquery_condition(self, alias, columns, qn):
        qn2 = self.connection.ops.quote_name
        if len(columns) == 1:
            sql, params = self.as_sql()
            return '%s.%s IN (%s)' % (qn(alias), qn2(columns[0]), sql), params

        for index, select_col in enumerate(self.query.select):
            lhs = '%s.%s' % (qn(select_col.col[0]), qn2(select_col.col[1]))
            rhs = '%s.%s' % (qn(alias), qn2(columns[index]))
            self.query.where.add(QueryWrapper('%s = %s' % (lhs, rhs), []),
                                 'AND')

        sql, params = self.as_sql()
        return 'EXISTS (%s)' % sql, params
Пример #10
0
    def get_db_prep_lookup(self, lookup_type, value):
        # If we are doing a lookup on a Related Field, we must be
        # comparing object instances. The value should be the PK of value,
        # not value itself.
        def pk_trace(value):
            # Value may be a primary key, or an object held in a relation.
            # If it is an object, then we need to get the primary key value for
            # that object. In certain conditions (especially one-to-one relations),
            # the primary key may itself be an object - so we need to keep drilling
            # down until we hit a value that can be used for a comparison.
            v, field = value, None
            try:
                while True:
                    v, field = getattr(v, v._meta.pk.name), v._meta.pk
            except AttributeError:
                pass

            if field:
                if lookup_type in ('range', 'in'):
                    v = [v]
                v = field.get_db_prep_lookup(lookup_type, v)
                if isinstance(v, list):
                    v = v[0]
            return v

        if hasattr(value, 'as_sql') or hasattr(value, '_as_sql'):
            # If the value has a relabel_aliases method, it will need to
            # be invoked before the final SQL is evaluated
            if hasattr(value, 'relabel_aliases'):
                return value
            if hasattr(value, 'as_sql'):
                sql, params = value.as_sql()
            else:
                sql, params = value._as_sql()
            return QueryWrapper(('(%s)' % sql), params)

        # FIXME: lt and gt are explicitally allowed to make
        # get_(next/prev)_by_date work; other lookups are not allowed since that
        # gets messy pretty quick. This is a good candidate for some refactoring
        # in the future.
        if lookup_type in ['exact', 'gt', 'lt', 'gte', 'lte']:
            return [pk_trace(value)]
        if lookup_type in ('range', 'in'):
            return [pk_trace(v) for v in value]
        elif lookup_type == 'isnull':
            return []
        raise TypeError, "Related Field has invalid lookup: %s" % lookup_type
Пример #11
0
 def get_db_prep_lookup(self, lookup_type, value):
     "Returns field's value prepared for database lookup."
     if hasattr(value, 'as_sql'):
         sql, params = value.as_sql()
         return QueryWrapper(('(%s)' % sql), params)
     if lookup_type in ('exact', 'regex', 'iregex', 'gt', 'gte', 'lt', 'lte', 'month', 'day', 'search'):
         return [value]
     elif lookup_type in ('range', 'in'):
         return value
     elif lookup_type in ('contains', 'icontains'):
         return ["%%%s%%" % connection.ops.prep_for_like_query(value)]
     elif lookup_type == 'iexact':
         return [connection.ops.prep_for_like_query(value)]
     elif lookup_type in ('startswith', 'istartswith'):
         return ["%s%%" % connection.ops.prep_for_like_query(value)]
     elif lookup_type in ('endswith', 'iendswith'):
         return ["%%%s" % connection.ops.prep_for_like_query(value)]
     elif lookup_type == 'isnull':
         return []
     elif lookup_type == 'year':
         try:
             value = int(value)
         except ValueError:
             raise ValueError("The __year lookup type requires an integer argument")
         if settings.DATABASE_ENGINE == 'sqlite3':
             first = '%s-01-01'
             second = '%s-12-31 23:59:59.999999'
         elif not connection.features.date_field_supports_time_value and self.get_internal_type() == 'DateField':
             first = '%s-01-01'
             second = '%s-12-31'
         elif not connection.features.supports_usecs:
             first = '%s-01-01 00:00:00'
             second = '%s-12-31 23:59:59.99'
         else:
             first = '%s-01-01 00:00:00'
             second = '%s-12-31 23:59:59.999999'
         return [first % value, second % value]
     raise TypeError("Field has invalid lookup: %s" % lookup_type)