Changeset 7235
- Timestamp:
- 03/13/08 06:48:25 (8 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/queryset-refactor/django/db/models/query.py
r7232 r7235 507 507 field_names = [f.attname for f in self.model._meta.fields] 508 508 509 self.query.add_fields(field_names )509 self.query.add_fields(field_names, False) 510 510 self.query.default_cols = False 511 511 self.field_names = field_names django/branches/queryset-refactor/django/db/models/sql/datastructures.py
r7164 r7235 9 9 class FullResultSet(Exception): 10 10 pass 11 12 class JoinError(Exception): 13 def __init__(self, level): 14 self.level = level 11 15 12 16 class Empty(object): django/branches/queryset-refactor/django/db/models/sql/query.py
r7231 r7235 18 18 from django.db.models.fields import FieldDoesNotExist 19 19 from django.core.exceptions import FieldError 20 from datastructures import EmptyResultSet, Empty 20 from datastructures import EmptyResultSet, Empty, JoinError 21 21 from constants import * 22 22 … … 508 508 if not alias: 509 509 alias = self.get_initial_alias() 510 result = self.setup_joins(pieces, opts, alias, False, False) 511 if isinstance(result, int): 510 try: 511 field, target, opts, joins = self.setup_joins(pieces, opts, alias, 512 False, False) 513 except JoinError: 512 514 raise FieldError("Cannot order by many-valued field: '%s'" % name) 513 field, target, opts, joins = result514 515 alias = joins[-1][-1] 515 516 col = target.column … … 813 814 allow_many = trim or not negate 814 815 815 result = self.setup_joins(parts, opts, alias, (connector == AND), 816 allow_many) 817 if isinstance(result, int): 818 self.split_exclude(filter_expr, LOOKUP_SEP.join(parts[:result])) 816 try: 817 field, target, opts, join_list = self.setup_joins(parts, opts, 818 alias, (connector == AND), allow_many) 819 except JoinError, e: 820 self.split_exclude(filter_expr, LOOKUP_SEP.join(parts[:e.level])) 819 821 return 820 field, target, opts, join_list = result821 822 if trim and len(join_list) > 1: 822 823 extra = join_list[-1] … … 973 974 for alias in join: 974 975 self.unref_alias(alias) 975 r eturn pos + 1976 raise JoinError(pos + 1) 976 977 if model: 977 978 # The field lives on a base class of the current model. … … 1129 1130 return not (self.low_mark or self.high_mark) 1130 1131 1131 def add_fields(self, field_names ):1132 def add_fields(self, field_names, allow_m2m=True): 1132 1133 """ 1133 1134 Adds the given (model) fields to the select set. The field names are … … 1136 1137 alias = self.get_initial_alias() 1137 1138 opts = self.get_meta() 1138 for name in field_names: 1139 u1, target, u2, joins = self.setup_joins(name.split(LOOKUP_SEP), 1140 opts, alias, False, False, True) 1141 self.select.append((joins[-1][-1], target.column)) 1139 try: 1140 for name in field_names: 1141 u1, target, u2, joins = self.setup_joins(name.split(LOOKUP_SEP), 1142 opts, alias, False, allow_m2m, True) 1143 self.select.append((joins[-1][-1], target.column)) 1144 except JoinError: 1145 raise FieldError("Invalid field name: '%s'" % name) 1142 1146 1143 1147 def add_ordering(self, *ordering):
