Fixed problem with refs #10811.
When 'to_field' is specified with a FK, then we need to check the pk value the object.
This commit is contained in:
parent
add78c58b5
commit
fd5897193f
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue