diff --git a/polymorphic/query_translate.py b/polymorphic/query_translate.py index 92115df..98da463 100644 --- a/polymorphic/query_translate.py +++ b/polymorphic/query_translate.py @@ -8,14 +8,7 @@ from django.db import models from django.contrib.contenttypes.models import ContentType from django.db.models import Q, FieldDoesNotExist -try: - from django.db.models.related import RelatedObject -except ImportError: - # django.db.models.related.RelatedObject was replaced - # by django.db.models.fields.related.ForeignObjectRel in - # Django 1.8 - from django.db.models.fields.related import ForeignObjectRel - RelatedObject = ForeignObjectRel +from django.db.models.fields.related import RelatedField # Django 1.8 from functools import reduce @@ -163,7 +156,7 @@ def translate_polymorphic_field_path(queryset_model, field_path): try: # rel = (field_object, model, direct, m2m) field = queryset_model._meta.get_field(classname) - if isinstance(field, RelatedObject): + if isinstance(field, RelatedField): # Can also test whether the field exists in the related object to avoid ambiguity between # class names and field names, but that never happens when your class names are in CamelCase. return field_path # No exception raised, field does exist. diff --git a/polymorphic/tests.py b/polymorphic/tests.py index 9fb0119..b2da0eb 100644 --- a/polymorphic/tests.py +++ b/polymorphic/tests.py @@ -153,6 +153,15 @@ class One2OneRelatingModelDerived(One2OneRelatingModel): field2 = models.CharField(max_length=10) +class ModelUnderRelParent(PolymorphicModel): + field1 = models.CharField(max_length=10) + _private = models.CharField(max_length=10) + + +class ModelUnderRelChild(PolymorphicModel): + parent = models.ForeignKey(ModelUnderRelParent) + + class MyManagerQuerySet(PolymorphicQuerySet): def my_queryset_foo(self): @@ -720,6 +729,14 @@ class PolymorphicTests(TestCase): self.assertEqual(repr(objects[0]), '') self.assertEqual(repr(objects[1]), '') + def test_polymorphic___filter_field(self): + p = ModelUnderRelParent.objects.create(_private=True, field1='AA') + ModelUnderRelChild.objects.create(parent=p) + + # The "___" filter should also parse to "parent" -> "_private" as fallback. + objects = ModelUnderRelChild.objects.filter(parent___private=True) + self.assertEqual(len(objects), 1) + def test_delete(self): self.create_model2abcd()