From 6b4967e88368934dbbb1f289c790ab813fa59c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anssi=20K=C3=A4=C3=A4ri=C3=A4inen?= Date: Tue, 23 Jul 2013 15:06:02 +0300 Subject: [PATCH] Minor change to get_extra_descriptor_filter() Refs #20611. --- django/db/models/fields/related.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 1034d8b2ac..e7683c6aec 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -296,10 +296,15 @@ class ReverseSingleRelatedObjectDescriptor(six.with_metaclass(RenameRelatedObjec params = dict( (rh_field.attname, getattr(instance, lh_field.attname)) for lh_field, rh_field in self.field.related_fields) - params.update(self.field.get_extra_descriptor_filter(instance)) qs = self.get_queryset(instance=instance) + extra_filter = self.field.get_extra_descriptor_filter(instance) + if isinstance(extra_filter, dict): + params.update(extra_filter) + qs = qs.filter(**params) + else: + qs = qs.filter(extra_filter, **params) # Assuming the database enforces foreign keys, this won't fail. - rel_obj = qs.get(**params) + rel_obj = qs.get() if not self.field.rel.multiple: setattr(rel_obj, self.field.related.get_cache_name(), instance) setattr(instance, self.cache_name, rel_obj) @@ -1003,10 +1008,11 @@ class ForeignObject(RelatedField): user does 'instance.fieldname', that is the extra filter is used in the descriptor of the field. - The filter should be something usable in .filter(**kwargs) call, and - will be ANDed together with the joining columns condition. + The filter should be either a dict usable in .filter(**kwargs) call or + a Q-object. The condition will be ANDed together with the relation's + joining columns. - A parallel method is get_extra_relation_restriction() which is used in + A parallel method is get_extra_restriction() which is used in JOIN and subquery conditions. """ return {}