Django

Code

Ticket #6956: sample-fix.txt

File sample-fix.txt, 3.1 kB (added by i_i, 8 months ago)

The fix extracted from external backend implementation

Line 
1 This is extracted from http://django-firebird.googlecode.com/files/firebird-qsrf-7398-2.patch
2 to show how I fixed this bug with Firebird backend.
3
4 Index: django/db/models/sql/subqueries.py
5 ===================================================================
6 --- django/db/models/sql/subqueries.py  (revision 7398)
7 +++ django/db/models/sql/subqueries.py  (working copy)
8 @@ -6,12 +6,19 @@
9  from django.core.exceptions import FieldError
10  from django.db.models.sql.constants import *
11  from django.db.models.sql.datastructures import RawValue, Date
12 -from django.db.models.sql.query import Query
13 +from django.db.models.sql.query import Query as _Query
14  from django.db.models.sql.where import AND
15  
16  __all__ = ['DeleteQuery', 'UpdateQuery', 'InsertQuery', 'DateQuery',
17          'CountQuery']
18  
19 +from django.db import connection
20 +if connection.features.uses_custom_queryset:
21 +    Query = connection.ops.query_class(_Query)
22 +else:
23 +    Query = _Query
24 +
25  class DeleteQuery(Query):
26      """
27      Delete queries are done through this class, since they are more constrained
28 @@ -24,7 +31,8 @@
29          """
30          assert len(self.tables) == 1, \
31                  "Can only delete from one table at a time."
32 -        result = ['DELETE FROM %s' % self.tables[0]]
33 +        qn = self.quote_name_unless_alias
34 +        result = ['DELETE FROM %s' % qn(self.tables[0])]
35          where, params = self.where.as_sql()
36          result.append('WHERE %s' % where)
37          return ' '.join(result), tuple(params)
38
39 Index: django/db/backends/firebird/base.py
40 ===================================================================
41 +    def query_class(this, DefaultQuery):
42 +        class FirebirdQuery(DefaultQuery):
43 +            def as_sql(self, with_limits=True):
44 +                do_offset = with_limits and (self.high_mark or self.low_mark)
45 +                if not do_offset:
46 +                    return super(FirebirdQuery, self).as_sql(with_limits=False)
47 +
48 +                self.pre_sql_setup()
49 +                limit_offset_before = []
50 +                if self.high_mark:
51 +                    limit_offset_before.append("FIRST %d" % (self.high_mark - self.low_mark))
52 +                if self.low_mark:
53 +                    limit_offset_before.append("SKIP %d" % self.low_mark)
54 +
55 +                sql, params= super(FirebirdQuery, self).as_sql(with_limits=False)
56 +                result = sql.replace('SELECT', "SELECT %s" % ' '.join(limit_offset_before))
57 +                return result, params
58 +        return FirebirdQuery
59 +
60 +    def query_set_class(this, DefaultQuerySet):
61 +        # Getting the base default `Query` object.
62 +        DefaultQuery = DefaultQuerySet().query.__class__
63 +
64 +        FirebirdQuery = this.query_class(DefaultQuery)
65 +
66 +        from django.db import connection
67 +        class FirebirdQuerySet(DefaultQuerySet):
68 +            "The FirebirdQuerySet is overriden to use FirebirdQuery."
69 +            def __init__(self, model=None, query=None):
70 +                super(FirebirdQuerySet, self).__init__(model=model, query=query)
71 +                self.query = query or FirebirdQuery(self.model, connection)
72 +        return FirebirdQuerySet