Fixed #12819. Fixed a bug with caching values of nullable 1to1 fields. Thanks, s.angel@twidi.com for the initial patch, and Alex Gaynor for the tests.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12543 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
3f443363f9
commit
65b451ae3e
|
@ -1203,7 +1203,7 @@ def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0,
|
||||||
# If the base object exists, populate the
|
# If the base object exists, populate the
|
||||||
# descriptor cache
|
# descriptor cache
|
||||||
setattr(obj, f.get_cache_name(), rel_obj)
|
setattr(obj, f.get_cache_name(), rel_obj)
|
||||||
if f.unique:
|
if f.unique and rel_obj is not None:
|
||||||
# If the field is unique, populate the
|
# If the field is unique, populate the
|
||||||
# reverse descriptor cache on the related object
|
# reverse descriptor cache on the related object
|
||||||
setattr(rel_obj, f.related.get_cache_name(), obj)
|
setattr(rel_obj, f.related.get_cache_name(), obj)
|
||||||
|
|
|
@ -44,3 +44,12 @@ class StatDetails(models.Model):
|
||||||
|
|
||||||
class AdvancedUserStat(UserStat):
|
class AdvancedUserStat(UserStat):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Image(models.Model):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
|
||||||
|
class Product(models.Model):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
image = models.OneToOneField(Image, null=True)
|
||||||
|
|
|
@ -2,7 +2,8 @@ from django import db
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from models import User, UserProfile, UserStat, UserStatResult, StatDetails, AdvancedUserStat
|
from models import (User, UserProfile, UserStat, UserStatResult, StatDetails,
|
||||||
|
AdvancedUserStat, Image, Product)
|
||||||
|
|
||||||
class ReverseSelectRelatedTestCase(TestCase):
|
class ReverseSelectRelatedTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -81,3 +82,10 @@ class ReverseSelectRelatedTestCase(TestCase):
|
||||||
stat = UserStat.objects.select_related('advanceduserstat').get(posts=200)
|
stat = UserStat.objects.select_related('advanceduserstat').get(posts=200)
|
||||||
self.assertEqual(stat.advanceduserstat.posts, 200)
|
self.assertEqual(stat.advanceduserstat.posts, 200)
|
||||||
self.assertQueries(1)
|
self.assertQueries(1)
|
||||||
|
|
||||||
|
def test_nullable_relation(self):
|
||||||
|
im = Image.objects.create(name="imag1")
|
||||||
|
p1 = Product.objects.create(name="Django Plushie", image=im)
|
||||||
|
p2 = Product.objects.create(name="Talking Django Plushie")
|
||||||
|
|
||||||
|
self.assertEqual(len(Product.objects.select_related("image")), 2)
|
||||||
|
|
Loading…
Reference in New Issue