Fix "Model" __ "_field" query support

Broken by 24e6b21204 for Django 1.9
upgrade
fix_request_path_info
Diederik van der Boor 2015-12-28 16:19:27 +01:00
parent 4e5ac03412
commit 07242d210f
2 changed files with 19 additions and 9 deletions

View File

@ -8,14 +8,7 @@ from django.db import models
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import Q, FieldDoesNotExist from django.db.models import Q, FieldDoesNotExist
try: from django.db.models.fields.related import RelatedField # Django 1.8
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 functools import reduce from functools import reduce
@ -163,7 +156,7 @@ def translate_polymorphic_field_path(queryset_model, field_path):
try: try:
# rel = (field_object, model, direct, m2m) # rel = (field_object, model, direct, m2m)
field = queryset_model._meta.get_field(classname) 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 # 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. # 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. return field_path # No exception raised, field does exist.

View File

@ -153,6 +153,15 @@ class One2OneRelatingModelDerived(One2OneRelatingModel):
field2 = models.CharField(max_length=10) 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): class MyManagerQuerySet(PolymorphicQuerySet):
def my_queryset_foo(self): def my_queryset_foo(self):
@ -720,6 +729,14 @@ class PolymorphicTests(TestCase):
self.assertEqual(repr(objects[0]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>') self.assertEqual(repr(objects[0]), '<Model2B: id 2, field1 (CharField), field2 (CharField)>')
self.assertEqual(repr(objects[1]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>') self.assertEqual(repr(objects[1]), '<Model2C: id 3, field1 (CharField), field2 (CharField), field3 (CharField)>')
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): def test_delete(self):
self.create_model2abcd() self.create_model2abcd()