#27365: Fields suddenly not found.
----------------------------------+-------------------------------
Reporter: brandon+django@… | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 1.9
Severity: Normal | Keywords: FieldDoesNotExist
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------+-------------------------------
Hello,
We just moved from Django 1.7.10 to 1.9.9. After the move a new error
began occurring. The exception is:
{{{ FieldDoesNotExist: No related field named '...' }}}
We see the exception when accessing the reverse OneToOne of a non-abstract
models.Model subclass that has been subclassed.
{{{
class Case(models.Model):
...lots of fields...
class SubclassCase(Case):
...lots more fields...
SubclassCase.objects.get(id=12345)
}}}
generates traceback
{{{
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-
packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/dist-
packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args,
**callback_kwargs)
File "/usr/local/lib/python2.7/dist-
packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/var/www/vhosts/prod/lib/workpath/workflow/views.py", line 1730,
in view_case
additional_view = case_module.view(case)
File
"/var/www/vhosts/prod/lib/workpath/workflow/cases/subclasscase/views.py",
line 286, in view
case = SubclassCase.objects.get(id=case.id)
File "/usr/local/lib/python2.7/dist-
packages/django/db/models/manager.py", line 122, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py",
line 378, in get
clone = self.filter(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py",
line 790, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py",
line 808, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/local/lib/python2.7/dist-
packages/django/db/models/sql/query.py", line 1243, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/usr/local/lib/python2.7/dist-
packages/django/db/models/sql/query.py", line 1269, in _add_q
allow_joins=allow_joins, split_subq=split_subq,
File "/usr/local/lib/python2.7/dist-
packages/django/db/models/sql/query.py", line 1149, in build_filter
lookups, parts, reffed_expression = self.solve_lookup_type(arg)
File "/usr/local/lib/python2.7/dist-
packages/django/db/models/sql/query.py", line 1035, in solve_lookup_type
_, field, _, lookup_parts = self.names_to_path(lookup_splitted,
self.get_meta())
File "/usr/local/lib/python2.7/dist-
packages/django/db/models/sql/query.py", line 1345, in names_to_path
targets = (final_field.remote_field.get_related_field(),)
File "/usr/local/lib/python2.7/dist-
packages/django/db/models/fields/reverse_related.py", line 244, in
get_related_field
self.field_name)
FieldDoesNotExist: No related field named 'subclasscase'
}}}
Whenever the exception occurs, it is exactly this exception every time
once {{{_filter_or_exclude}}} is reached. We've seen it in the context of
function based views, class based views, the views of our tastypie backed
API (XML and JSON) and from view functions that support light-weight JSON
functions.
We see it across multiple disconnected deployments with completely
separate machines, datastores, databases, etc.
We do not see it all the time.
We do not see it when running under the development server.
An apache restart fixes it... for a little while.
We are using mpm_event with WSGI.
Our mpm_event configuration looks like this:
{{{
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 5000
</IfModule>
}}}
Our WSGI ({{{libapache2-mod-wsgi 3.4-4ubuntu2.1.14.04.2}}}) configuration
looks like this:
{{{
WSGIDaemonProcess prod processes=2 python-path=/usr/local/lib/python2.7
/dist-packages:/var/www/vhosts/prod/lib
}}}
Based on our experience that an apache restart fixed it we changed our
WSGI configuration to this:
{{{
WSGIDaemonProcess prod processes=10 threads=1 maximum-requests=50 python-
path=/usr/local/lib/python2.7/dist-packages:/var/www/vhosts/prod/lib
}}}
This causes the apache children to cycle quickly and the error goes away
but as you can imagine this slows down the site considerably.
The error occurs much more frequently with 1.8.15 than with 1.9.9 - but
again it *never* occurred in 1.7.10. Based on this, and looking at {{{git
diff 1.7.10...1.9.9 -- django/db/models/options.py}}}; I believe it is
somehow related to the _meta API change and the introduction of
_get_fields_cache in the Options class.
However, I am very unfamiliar with core django code... so that could be
completely wrong.
The real difficulty here is that it seems to be time or number-of-requests
based. A apache child, immediately after a restart, hums along nicely. But
it *seems* that if any particular code path that needs to do that kind of
"reverse OneToOne" lookup is crossed too many times the error, that exact
exception, occurs. Once it has occurred for a child, that child is done.
If you access the site and get that child looking for that object, the
exception occurs. But if you get another apache child or are looking for
another object, the error has a good chance of not occurring. Again, if
that child cycles out or if Apache is restarted (not reloaded) the error
vanishes completely... for a little while, seemingly dependent on site
traffic.
I'll be glad to supply any debug information I can. As pervasive as this
error was in production, I have been unable to reproduce the problem in a
development environment. As soon as I have, I'll update the ticket with
whatever information I've found.
Any insight anyone could provide in debugging this problem would be much
appreciated. I would not hesitate to submit a patch if I had one.
Thanks,
--Brandon
--
Ticket URL: <https://code.djangoproject.com/ticket/27365>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/073.51ce40cb6a8c64c462943f7ea86346f3%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.