Fixed applabel__ModelName___field looksups

Closes: #286
(cherry picked from commit 8f0932b71e)
fix_request_path_info
Diederik van der Boor 2017-11-20 15:18:43 +01:00
parent ca1a982c34
commit 9f92b0614d
2 changed files with 15 additions and 1 deletions

View File

@ -7,6 +7,8 @@ from __future__ import absolute_import
import copy import copy
import django import django
from functools import reduce from functools import reduce
from django.apps import apps
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db import models from django.db import models
from django.db.models.fields.related import ForeignObjectRel, RelatedField from django.db.models.fields.related import ForeignObjectRel, RelatedField
@ -148,7 +150,7 @@ def translate_polymorphic_field_path(queryset_model, field_path):
if '__' in classname: if '__' in classname:
# the user has app label prepended to class name via __ => use Django's get_model function # the user has app label prepended to class name via __ => use Django's get_model function
appname, sep, classname = classname.partition('__') appname, sep, classname = classname.partition('__')
model = models.get_model(appname, classname) model = apps.get_model(appname, classname)
assert model, 'PolymorphicModel: model %s (in app %s) not found!' % (model.__name__, appname) assert model, 'PolymorphicModel: model %s (in app %s) not found!' % (model.__name__, appname)
if not issubclass(model, queryset_model): if not issubclass(model, queryset_model):
e = 'PolymorphicModel: queryset filter error: "' + model.__name__ + '" is not derived from "' + queryset_model.__name__ + '"' e = 'PolymorphicModel: queryset filter error: "' + model.__name__ + '" is not derived from "' + queryset_model.__name__ + '"'

View File

@ -427,6 +427,18 @@ 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_applabel___filter(self):
self.create_model2abcd()
self.assertEqual(Model2B._meta.app_label, 'polymorphic')
objects = Model2A.objects.filter(Q(polymorphic__Model2B___field2='B2') | Q(polymorphic__Model2C___field3='C3'))
self.assertQuerysetEqual(
objects,
[Model2B, Model2C],
transform=lambda o: o.__class__,
ordered=False,
)
def test_query_filter_exclude_is_immutable(self): def test_query_filter_exclude_is_immutable(self):
# given # given
q_to_reuse = Q(Model2B___field2='something') q_to_reuse = Q(Model2B___field2='something')