Skip to content

Commit

Permalink
Fixed bug in manipulator_valid_rel_key -- it assumed the related obje…
Browse files Browse the repository at this point in the history
…ct was related by the primary-key field, whereas this didn't work with ForeignKeys to non-primary-key fields

git-svn-id: http://code.djangoproject.com/svn/django/trunk@3338 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
adrianholovaty committed Jul 13, 2006
1 parent 36e4e5a commit 0a2e8da
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions django/db/models/fields/related.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def add_lookup(rel_cls, field):
name = field.rel.to
module = rel_cls.__module__
key = (module, name)
# Has the model already been loaded?
# Has the model already been loaded?
# If so, resolve the string reference right away
model = get_model(rel_cls._meta.app_label,field.rel.to)
if model:
Expand All @@ -46,7 +46,7 @@ def manipulator_valid_rel_key(f, self, field_data, all_data):
"Validates that the value is a valid foreign key"
klass = f.rel.to
try:
klass._default_manager.get(pk=field_data)
klass._default_manager.get(**{f.rel.field_name: field_data})
except klass.DoesNotExist:
raise validators.ValidationError, _("Please enter a valid %s.") % f.verbose_name

Expand Down Expand Up @@ -79,11 +79,11 @@ def do_related_class(self, other, cls):
self.contribute_to_related_class(other, related)

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,
# 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.
# 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
Expand All @@ -94,16 +94,16 @@ def pk_trace(value):
v = getattr(v, v._meta.pk.name)
except AttributeError:
pass
return v
return v

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

def _get_related_query_name(self, opts):
# This method defines the name that can be used to identify this related object
# in a table-spanning query. It uses the lower-cased object_name by default,
Expand Down

0 comments on commit 0a2e8da

Please sign in to comment.