From d5d8d35e501ca72e1abf801620e321bc6972f639 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Sat, 28 May 2016 09:14:02 -0400 Subject: [1.9.x] Fixed #26667 -- Fixed a regression in queries on a OneToOneField that has to_field and primary_key=True. Thanks Simon Charette for review. Backport of e2296e7f0acf9c50868ab997ba565c1f47beb45b from master --- django/db/models/fields/related_lookups.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'django') diff --git a/django/db/models/fields/related_lookups.py b/django/db/models/fields/related_lookups.py index 0f5a8b5e21..27d649f1b5 100644 --- a/django/db/models/fields/related_lookups.py +++ b/django/db/models/fields/related_lookups.py @@ -24,15 +24,16 @@ def get_normalized_value(value, lhs): from django.db.models import Model if isinstance(value, Model): value_list = [] - # A case like Restaurant.objects.filter(place=restaurant_instance), - # where place is a OneToOneField and the primary key of Restaurant. - if getattr(lhs.output_field, 'primary_key', False): - return (value.pk,) sources = lhs.output_field.get_path_info()[-1].target_fields for source in sources: while not isinstance(value, source.model) and source.remote_field: source = source.remote_field.model._meta.get_field(source.remote_field.field_name) - value_list.append(getattr(value, source.attname)) + try: + value_list.append(getattr(value, source.attname)) + except AttributeError: + # A case like Restaurant.objects.filter(place=restaurant_instance), + # where place is a OneToOneField and the primary key of Restaurant. + return (value.pk,) return tuple(value_list) if not isinstance(value, tuple): return (value,) -- cgit v1.3