summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2015-01-22 01:43:49 -0500
committerSimon Charette <charette.s@gmail.com>2015-01-29 14:42:28 -0500
commita301061f88268255fc2660ca993a84b8bf12f9d2 (patch)
treefee7823f5f53fee828b979837aa99e48e00c7a8e
parent7b92acea7055c6b39207a813b52e683a3672e467 (diff)
[1.8.x] Fixed #23940 -- Allowed model fields to be named `exact`.
An explicit `__exact` lookup in the related managers filters was interpreted as a reference to a foreign `exact` field. Thanks to Trac alias zhiyajun11 for the report, Josh for the investigation, Loïc for the test name and Tim for the review. Backport of eb4cdfbdd64a95b303eaaa40a070521aa58362fd from master
-rw-r--r--django/db/models/fields/related.py2
-rw-r--r--tests/managers_regress/models.py5
-rw-r--r--tests/managers_regress/tests.py8
3 files changed, 12 insertions, 3 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index bcf7dd7a17..8acae08efb 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -681,7 +681,7 @@ def create_foreign_related_manager(superclass, rel_field, rel_model):
def __init__(self, instance):
super(RelatedManager, self).__init__()
self.instance = instance
- self.core_filters = {'%s__exact' % rel_field.name: instance}
+ self.core_filters = {rel_field.name: instance}
self.model = rel_model
def __call__(self, **kwargs):
diff --git a/tests/managers_regress/models.py b/tests/managers_regress/models.py
index c8869f1e26..99494448bd 100644
--- a/tests/managers_regress/models.py
+++ b/tests/managers_regress/models.py
@@ -129,6 +129,7 @@ class Child7(Parent):
@python_2_unicode_compatible
class RelatedModel(models.Model):
test_gfk = GenericRelation('RelationModel', content_type_field='gfk_ctype', object_id_field='gfk_id')
+ exact = models.NullBooleanField()
def __str__(self):
return force_text(self.pk)
@@ -140,8 +141,8 @@ class RelationModel(models.Model):
m2m = models.ManyToManyField(RelatedModel, related_name='test_m2m')
- gfk_ctype = models.ForeignKey(ContentType)
- gfk_id = models.IntegerField()
+ gfk_ctype = models.ForeignKey(ContentType, null=True)
+ gfk_id = models.IntegerField(null=True)
gfk = GenericForeignKey(ct_field='gfk_ctype', fk_field='gfk_id')
def __str__(self):
diff --git a/tests/managers_regress/tests.py b/tests/managers_regress/tests.py
index 0d24873a10..af507f0b75 100644
--- a/tests/managers_regress/tests.py
+++ b/tests/managers_regress/tests.py
@@ -201,3 +201,11 @@ class ManagersRegressionTests(TestCase):
t.render(Context({'related': related})),
''.join([force_text(relation.pk)] * 3),
)
+
+ def test_field_can_be_called_exact(self):
+ # Make sure related managers core filters don't include an
+ # explicit `__exact` lookup that could be interpreted as a
+ # reference to a foreign `exact` field. refs #23940.
+ related = RelatedModel.objects.create(exact=False)
+ relation = related.test_fk.create()
+ self.assertEqual(related.test_fk.get(), relation)