summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnubhav Joshi <anubhav9042@gmail.com>2014-06-30 18:43:35 +0530
committerTim Graham <timograham@gmail.com>2014-06-30 10:25:57 -0400
commitfd5897193f0bd8fa211885be5726f8e5613f3c08 (patch)
tree036e8e5b5e3041fda649bb013daf9d2ce44724e0
parentadd78c58b5adb1d6e92cb5c998465442492d7bfb (diff)
Fixed problem with refs #10811.
When 'to_field' is specified with a FK, then we need to check the pk value the object.
-rw-r--r--django/db/models/fields/related.py6
-rw-r--r--tests/many_to_one_regress/models.py6
-rw-r--r--tests/many_to_one_regress/tests.py11
3 files changed, 16 insertions, 7 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index ac53515c1b..cd592d587c 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -623,13 +623,13 @@ class ReverseSingleRelatedObjectDescriptor(object):
# Set the values of the related field.
else:
for lh_field, rh_field in self.field.related_fields:
- val = getattr(value, rh_field.attname)
- if val is None:
+ pk = value._get_pk_val()
+ if pk is None:
raise ValueError(
'Cannot assign "%r": "%s" instance isn\'t saved in the database.' %
(value, self.field.rel.to._meta.object_name)
)
- setattr(instance, lh_field.attname, val)
+ setattr(instance, lh_field.attname, getattr(value, rh_field.attname))
# Since we already know what the related object is, seed the related
# object caches now, too. This avoids another db hit if you get the
diff --git a/tests/many_to_one_regress/models.py b/tests/many_to_one_regress/models.py
index c94bc5e05c..f1239dbef2 100644
--- a/tests/many_to_one_regress/models.py
+++ b/tests/many_to_one_regress/models.py
@@ -26,7 +26,7 @@ class Third(models.Model):
class Parent(models.Model):
- name = models.CharField(max_length=20)
+ name = models.CharField(max_length=20, unique=True)
bestchild = models.ForeignKey('Child', null=True, related_name='favored_by')
@@ -35,6 +35,10 @@ class Child(models.Model):
parent = models.ForeignKey(Parent)
+class ToFieldChild(models.Model):
+ parent = models.ForeignKey(Parent, to_field='name')
+
+
# Multiple paths to the same model (#7110, #7125)
@python_2_unicode_compatible
class Category(models.Model):
diff --git a/tests/many_to_one_regress/tests.py b/tests/many_to_one_regress/tests.py
index a19991fd3b..f8e4d96363 100644
--- a/tests/many_to_one_regress/tests.py
+++ b/tests/many_to_one_regress/tests.py
@@ -4,7 +4,7 @@ from django.db import models
from django.test import TestCase
from .models import (
- First, Third, Parent, Child, Category, Record, Relation, Car, Driver)
+ First, Third, Parent, Child, ToFieldChild, Category, Record, Relation, Car, Driver)
class ManyToOneRegressionTests(TestCase):
@@ -67,10 +67,15 @@ class ManyToOneRegressionTests(TestCase):
# Creation using keyword argument and unsaved related instance (#8070).
p = Parent()
with self.assertRaisesMessage(ValueError,
- 'Cannot assign "%r": "%s" instance isn\'t saved in the database.'
- % (p, Child.parent.field.rel.to._meta.object_name)):
+ 'Cannot assign "%r": "%s" instance isn\'t saved in the database.'
+ % (p, Child.parent.field.rel.to._meta.object_name)):
Child(parent=p)
+ with self.assertRaisesMessage(ValueError,
+ 'Cannot assign "%r": "%s" instance isn\'t saved in the database.'
+ % (p, Child.parent.field.rel.to._meta.object_name)):
+ ToFieldChild(parent=p)
+
# Creation using attname keyword argument and an id will cause the
# related object to be fetched.
p = Parent.objects.get(name="Parent")