Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed problem with refs #10811.

When 'to_field' is specified with a FK, then we need to check the pk value
the object.
  • Loading branch information...
commit fd5897193f0bd8fa211885be5726f8e5613f3c08 1 parent add78c5
@coder9042 coder9042 authored timgraham committed
View
6 django/db/models/fields/related.py
@@ -623,13 +623,13 @@ def __set__(self, instance, value):
# 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
View
6 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):
View
11 tests/many_to_one_regress/tests.py
@@ -4,7 +4,7 @@
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 @@ def test_fk_assignment_and_related_object_cache(self):
# 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")
Please sign in to comment.
Something went wrong with that request. Please try again.