diff options
| author | Carl Meyer <carl@oddbird.net> | 2011-01-25 03:14:28 +0000 |
|---|---|---|
| committer | Carl Meyer <carl@oddbird.net> | 2011-01-25 03:14:28 +0000 |
| commit | 227c5e80dbff2b731a1cba8c4dd94c00526a3e76 (patch) | |
| tree | 1b890c586370158597c5afa9109a21df7b89f861 /django | |
| parent | 7c888a7aa945352193303b557cbf654957e0dd45 (diff) | |
Fixed #11319 - Added lookup support for ForeignKey.to_field. Also reverted no-longer-needed model formsets workaround for lack of such support from r10756. Thanks Russell and Alex for review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@15303 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/fields/related.py | 13 | ||||
| -rw-r--r-- | django/db/models/sql/query.py | 7 | ||||
| -rw-r--r-- | django/forms/models.py | 6 |
3 files changed, 19 insertions, 7 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index f2adc7af0c..b9ffcbd238 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -178,9 +178,20 @@ class RelatedField(object): # 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 + + # In the case of an FK to 'self', this check allows to_field to be used + # for both forwards and reverse lookups across the FK. (For normal FKs, + # it's only relevant for forward lookups). + if isinstance(v, self.rel.to): + field_name = getattr(self.rel, "field_name", None) + else: + field_name = None try: while True: - v = getattr(v, v._meta.pk.name) + if field_name is None: + field_name = v._meta.pk.name + v = getattr(v, field_name) + field_name = None except AttributeError: pass except exceptions.ObjectDoesNotExist: diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 1c58a24d45..e028800d72 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1364,7 +1364,12 @@ class Query(object): table = opts.db_table from_col = local_field.column to_col = field.column - target = opts.pk + # In case of a recursive FK, use the to_field for + # reverse lookups as well + if orig_field.model is local_field.model: + target = opts.get_field(field.rel.field_name) + else: + target = opts.pk orig_opts._join_cache[name] = (table, from_col, to_col, opts, target) diff --git a/django/forms/models.py b/django/forms/models.py index de52b6a7e0..6babebbe36 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -700,13 +700,9 @@ class BaseInlineFormSet(BaseModelFormSet): self.save_as_new = save_as_new # is there a better way to get the object descriptor? self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name() - if self.fk.rel.field_name == self.fk.rel.to._meta.pk.name: - backlink_value = self.instance - else: - backlink_value = getattr(self.instance, self.fk.rel.field_name) if queryset is None: queryset = self.model._default_manager - qs = queryset.filter(**{self.fk.name: backlink_value}) + qs = queryset.filter(**{self.fk.name: self.instance}) super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix, queryset=qs) |
