[1.8.x] Fixed #24146 -- Allowed model._meta.get_field() to be used after apps.models_ready
Backport of 19188826b4
from master
This commit is contained in:
parent
c6a49d4f17
commit
fdcc9c47d5
|
@ -535,7 +535,7 @@ class Options(object):
|
||||||
except KeyError:
|
except KeyError:
|
||||||
# If the app registry is not ready, reverse fields are
|
# If the app registry is not ready, reverse fields are
|
||||||
# unavailable, therefore we throw a FieldDoesNotExist exception.
|
# unavailable, therefore we throw a FieldDoesNotExist exception.
|
||||||
if not self.apps.ready:
|
if not self.apps.models_ready:
|
||||||
raise FieldDoesNotExist(
|
raise FieldDoesNotExist(
|
||||||
"%s has no field named %r. The app cache isn't ready yet, "
|
"%s has no field named %r. The app cache isn't ready yet, "
|
||||||
"so if this is an auto-created related field, it won't "
|
"so if this is an auto-created related field, it won't "
|
||||||
|
|
|
@ -49,6 +49,7 @@ class Book(models.Model):
|
||||||
class AuthorsBooks(models.Model):
|
class AuthorsBooks(models.Model):
|
||||||
author = models.ForeignKey(Author)
|
author = models.ForeignKey(Author)
|
||||||
book = models.ForeignKey(Book)
|
book = models.ForeignKey(Book)
|
||||||
|
featured = models.BooleanField()
|
||||||
|
|
||||||
|
|
||||||
class State(models.Model):
|
class State(models.Model):
|
||||||
|
|
|
@ -688,3 +688,20 @@ class SystemChecksTestCase(TestCase):
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
self.assertEqual(errors, expected)
|
self.assertEqual(errors, expected)
|
||||||
|
|
||||||
|
def test_list_filter_works_on_through_field_even_when_apps_not_ready(self):
|
||||||
|
"""
|
||||||
|
Ensure list_filter can access reverse fields even when the app registry
|
||||||
|
is not ready; refs #24146.
|
||||||
|
"""
|
||||||
|
class BookAdminWithListFilter(admin.ModelAdmin):
|
||||||
|
list_filter = ['authorsbooks__featured']
|
||||||
|
|
||||||
|
# Temporarily pretending apps are not ready yet. This issue can happen
|
||||||
|
# if the value of 'list_filter' refers to a 'through__field'.
|
||||||
|
Book._meta.apps.ready = False
|
||||||
|
try:
|
||||||
|
errors = BookAdminWithListFilter.check(model=Book)
|
||||||
|
self.assertEqual(errors, [])
|
||||||
|
finally:
|
||||||
|
Book._meta.apps.ready = True
|
||||||
|
|
|
@ -178,7 +178,7 @@ class GetFieldByNameTests(OptionsBaseTests):
|
||||||
opts = Person._meta
|
opts = Person._meta
|
||||||
# If apps registry is not ready, get_field() searches over only
|
# If apps registry is not ready, get_field() searches over only
|
||||||
# forward fields.
|
# forward fields.
|
||||||
opts.apps.ready = False
|
opts.apps.models_ready = False
|
||||||
try:
|
try:
|
||||||
# 'data_abstract' is a forward field, and therefore will be found
|
# 'data_abstract' is a forward field, and therefore will be found
|
||||||
self.assertTrue(opts.get_field('data_abstract'))
|
self.assertTrue(opts.get_field('data_abstract'))
|
||||||
|
@ -191,7 +191,7 @@ class GetFieldByNameTests(OptionsBaseTests):
|
||||||
with self.assertRaisesMessage(FieldDoesNotExist, msg):
|
with self.assertRaisesMessage(FieldDoesNotExist, msg):
|
||||||
opts.get_field('relating_baseperson')
|
opts.get_field('relating_baseperson')
|
||||||
finally:
|
finally:
|
||||||
opts.apps.ready = True
|
opts.apps.models_ready = True
|
||||||
|
|
||||||
|
|
||||||
class RelationTreeTests(TestCase):
|
class RelationTreeTests(TestCase):
|
||||||
|
|
Loading…
Reference in New Issue