mirror of
https://github.com/django/django.git
synced 2025-11-07 07:15:35 +00:00
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
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user