[1.5.x] Fixed empty strings + to_field regression on Oracle

Querying the reverse side of nullable to_field relation, where both
sides can contain null values resulted in incorrect results. The reason
was not detecting '' as NULL.

Refs #17541, backpatch of 09fcb70c80.
This commit is contained in:
Anssi Kääriäinen 2013-02-23 00:00:41 +02:00
parent b17a572eb3
commit 8a99d718f7
2 changed files with 4 additions and 3 deletions

View File

@ -1,6 +1,6 @@
from operator import attrgetter from operator import attrgetter
from django.db import connection, router from django.db import connection, connections, router
from django.db.backends import util from django.db.backends import util
from django.db.models import signals, get_model from django.db.models import signals, get_model
from django.db.models.fields import (AutoField, Field, IntegerField, from django.db.models.fields import (AutoField, Field, IntegerField,
@ -497,7 +497,8 @@ class ForeignRelatedObjectsDescriptor(object):
except (AttributeError, KeyError): except (AttributeError, KeyError):
db = self._db or router.db_for_read(self.model, instance=self.instance) db = self._db or router.db_for_read(self.model, instance=self.instance)
qs = super(RelatedManager, self).get_query_set().using(db).filter(**self.core_filters) qs = super(RelatedManager, self).get_query_set().using(db).filter(**self.core_filters)
if getattr(self.instance, attname) is None: val = getattr(self.instance, attname)
if val is None or val == '' and connections[db].features.interprets_empty_strings_as_nulls:
# We don't want to use qs.none() here, see #19652 # We don't want to use qs.none() here, see #19652
return qs.filter(pk__in=[]) return qs.filter(pk__in=[])
qs._known_related_objects = {rel_field: {self.instance.pk: self.instance}} qs._known_related_objects = {rel_field: {self.instance.pk: self.instance}}

View File

@ -126,7 +126,7 @@ class ManyToOneRegressionTests(TestCase):
# Now the model is saved, so we will need to execute an query. # Now the model is saved, so we will need to execute an query.
with self.assertNumQueries(1): with self.assertNumQueries(1):
self.assertEqual(th.child_set.count(), 0) self.assertEqual(th.child_set.count(), 0)
def test_related_null_to_field(self): def test_related_null_to_field(self):
c1 = Car.objects.create() c1 = Car.objects.create()
c2 = Car.objects.create() c2 = Car.objects.create()