Code

Opened 3 months ago

Closed 3 months ago

#21828 closed Bug (wontfix)

Can no longer use model meta methods in other methods after app loading changes

Reported by: timo Owned by: nobody
Component: Database layer (models, ORM) Version: master
Severity: Normal Keywords: app-loading
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

To reproduce, add the following as an attribute to the Choice model in the tutorial and try to runserver:

foo = Poll._meta.get_all_field_names()

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 427, in execute_from_command_line
    utility.execute()
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 391, in execute
    django.setup()
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/apps/registry.py", line 105, in populate
    app_config.import_models(all_models)
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/apps/base.py", line 160, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/timgraham/code/mysite/polls/models.py", line 21, in <module>
    class Choice(models.Model):
  File "/home/timgraham/code/mysite/polls/models.py", line 26, in Choice
    foo = Poll._meta.get_all_field_names()
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/db/models/options.py", line 420, in get_all_field_names
    cache = self.init_name_map()
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/db/models/options.py", line 433, in init_name_map
    for f, model in self.get_all_related_m2m_objects_with_model():
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/db/models/options.py", line 550, in get_all_related_m2m_objects_with_model
    cache = self._fill_related_many_to_many_cache()
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/db/models/options.py", line 564, in _fill_related_many_to_many_cache
    for klass in self.apps.get_models():
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/utils/lru_cache.py", line 101, in wrapper
    result = user_function(*args, **kwds)
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/apps/registry.py", line 155, in get_models
    self.check_ready()
  File "/home/timgraham/code/tutorial/local/lib/python2.7/site-packages/django/apps/registry.py", line 118, in check_ready
    raise RuntimeError("App registry isn't ready yet.")
RuntimeError: App registry isn't ready yet.

Attachments (0)

Change History (3)

comment:1 Changed 3 months ago by akaariai

The get_all_field_names() method isn't safe to call when all apps aren't loaded. For example all reverse m2m fields should be in get_all_field_names(), but all reverse m2m fields aren't guaranteed to be available until all models are loaded (any model not yet loaded could have a m2m field pointing to current model).

Based on the report it is hard to decide how to proceed. Which use cases are broken? Are there other ways to achieve those use cases?

comment:2 Changed 3 months ago by timo

The use case is attributes on a model that includes list of fields from mixins. I can replace get_all_field_names() with local_fields to achieve what I'm trying to do. If we can't and/or don't want to make any code changes, we can close this. Since _meta is private API, I don't think it warrants a documentation note.

comment:3 Changed 3 months ago by mjtamlyn

  • Resolution set to wontfix
  • Status changed from new to closed

I agree with akaariai's assessment of the situation. get_all_field_names() should fail in this situation. Consequently, closing as wontfix.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.