Changeset 7773
- Timestamp:
- 06/26/08 22:27:20 (3 months ago)
- Files:
-
- django/trunk/django/db/models/sql/query.py (modified) (4 diffs)
- django/trunk/django/db/models/sql/subqueries.py (modified) (4 diffs)
- django/trunk/django/db/models/sql/where.py (modified) (4 diffs)
- django/trunk/tests/regressiontests/queries/models.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/db/models/sql/query.py
r7761 r7773 8 8 """ 9 9 10 import datetime 10 11 from copy import deepcopy 11 12 … … 1049 1050 self.promote_alias(table) 1050 1051 1051 self.where.add((alias, col, field, lookup_type, value), connector) 1052 # To save memory and copying time, convert the value from the Python 1053 # object to the actual value used in the SQL query. 1054 if field: 1055 params = field.get_db_prep_lookup(lookup_type, value) 1056 else: 1057 params = Field().get_db_prep_lookup(lookup_type, value) 1058 if isinstance(value, datetime.datetime): 1059 annotation = datetime.datetime 1060 else: 1061 annotation = bool(value) 1062 1063 self.where.add((alias, col, field.db_type(), lookup_type, annotation, 1064 params), connector) 1052 1065 1053 1066 if negate: … … 1059 1072 if self.alias_map[alias][JOIN_TYPE] == self.LOUTER: 1060 1073 j_col = self.alias_map[alias][RHS_JOIN_COL] 1061 entry = Node([(alias, j_col, None, 'isnull', True)]) 1074 entry = Node([(alias, j_col, None, 'isnull', True, 1075 [True])]) 1062 1076 entry.negate() 1063 1077 self.where.add(entry, AND) … … 1067 1081 # exclude the "foo__in=[]" case from this handling, because 1068 1082 # it's short-circuited in the Where class. 1069 entry = Node([(alias, col, field, 'isnull', True)])1083 entry = Node([(alias, col, None, 'isnull', True, [True])]) 1070 1084 entry.negate() 1071 1085 self.where.add(entry, AND) django/trunk/django/db/models/sql/subqueries.py
r7763 r7773 50 50 where = self.where_class() 51 51 where.add((None, related.field.m2m_reverse_name(), 52 related.field , 'in',52 related.field.db_type(), 'in', True, 53 53 pk_list[offset : offset+GET_ITERATOR_CHUNK_SIZE]), 54 54 AND) … … 60 60 from django.contrib.contenttypes.models import ContentType 61 61 field = f.rel.to._meta.get_field(f.content_type_field_name) 62 w1.add((None, field.column, field , 'exact',63 ContentType.objects.get_for_model(cls).id), AND)62 w1.add((None, field.column, field.db_type(), 'exact', True, 63 [ContentType.objects.get_for_model(cls).id]), AND) 64 64 for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): 65 65 where = self.where_class() 66 where.add((None, f.m2m_column_name(), f , 'in',66 where.add((None, f.m2m_column_name(), f.db_type(), 'in', True, 67 67 pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), 68 68 AND) … … 82 82 where = self.where_class() 83 83 field = self.model._meta.pk 84 where.add((None, field.column, field , 'in',84 where.add((None, field.column, field.db_type(), 'in', True, 85 85 pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), AND) 86 86 self.do_query(self.model._meta.db_table, where) … … 205 205 self.where = self.where_class() 206 206 f = self.model._meta.pk 207 self.where.add((None, f.column, f , 'in',207 self.where.add((None, f.column, f.db_type(), 'in', True, 208 208 pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), 209 209 AND) django/trunk/django/db/models/sql/where.py
r7620 r7773 22 22 23 23 The children in this tree are usually either Q-like objects or lists of 24 [table_alias, field_name, field_class, lookup_type, value]. However, a 25 child could also be any class with as_sql() and relabel_aliases() methods. 24 [table_alias, field_name, db_type, lookup_type, value_annotation, 25 params]. However, a child could also be any class with as_sql() and 26 relabel_aliases() methods. 26 27 """ 27 28 default = AND … … 89 90 def make_atom(self, child, qn): 90 91 """ 91 Turn a tuple (table_alias, field_name, field_class, lookup_type, value)92 into valid SQL.92 Turn a tuple (table_alias, field_name, db_type, lookup_type, 93 value_annot, params) into valid SQL. 93 94 94 95 Returns the string for the SQL fragment and the parameters to use for 95 96 it. 96 97 """ 97 table_alias, name, field, lookup_type, value= child98 table_alias, name, db_type, lookup_type, value_annot, params = child 98 99 if table_alias: 99 100 lhs = '%s.%s' % (qn(table_alias), qn(name)) 100 101 else: 101 102 lhs = qn(name) 102 db_type = field and field.db_type() or None103 ##db_type = field and field.db_type() or None 103 104 field_sql = connection.ops.field_cast_sql(db_type) % lhs 104 105 105 if isinstance(value, datetime.datetime):106 if value_annot is datetime.datetime: 106 107 cast_sql = connection.ops.datetime_cast_sql() 107 108 else: 108 109 cast_sql = '%s' 109 110 110 if field:111 params = field.get_db_prep_lookup(lookup_type, value)112 else:113 params = Field().get_db_prep_lookup(lookup_type, value)114 111 if isinstance(params, QueryWrapper): 115 112 extra, params = params.data … … 124 121 125 122 if lookup_type == 'in': 126 if not value :123 if not value_annot: 127 124 raise EmptyResultSet 128 125 if extra: 129 126 return ('%s IN %s' % (field_sql, extra), params) 130 return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len( value))),127 return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len(params))), 131 128 params) 132 129 elif lookup_type in ('range', 'year'): … … 136 133 field_sql), params) 137 134 elif lookup_type == 'isnull': 138 return ('%s IS %sNULL' % (field_sql, (not value and 'NOT ' or '')),139 params)135 return ('%s IS %sNULL' % (field_sql, 136 (not value_annot and 'NOT ' or '')), ()) 140 137 elif lookup_type == 'search': 141 138 return (connection.ops.fulltext_search_sql(field_sql), params) django/trunk/tests/regressiontests/queries/models.py
r7765 r7773 4 4 5 5 import datetime 6 import pickle 6 7 7 8 from django.db import models … … 792 793 [] 793 794 795 Bug #7204, #7506 -- make sure querysets with related fields can be pickled. If 796 this doesn't crash, it's a Good Thing. 797 >>> out = pickle.dumps(Item.objects.all()) 798 794 799 """} 795 800
