Opened 18 years ago
Closed 18 years ago
#4375 closed (wontfix)
generic view archive_year is querying all objects, unexplained.
Reported by: | Owned by: | Jacob | |
---|---|---|---|
Component: | Generic views | Version: | 0.96 |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Here is my urls.py , pretty much identical to djangobook.
info_dict = { 'queryset': Report.objects.all(), 'date_field': 'date', 'make_object_list': 'False', } urlpatterns = patterns('django.views.generic.date_based', (r'^report/(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$', 'object_detail', dict(info_dict, slug_field='slug')), (r'^report/(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$', 'archive_day', info_dict), (r'^report/(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'archive_month', info_dict), (r'^report/(?P<year>\d{4})/$', 'archive_year', info_dict), (r'^report/?$', 'archive_index', info_dict), )
Here are the queries I see in my sql log, as the python process climbs in memory usage and 100cpu until django server crashes.
SELECT CAST(DATE_FORMAT(`reports`.`date`, '%Y-%m-01 00:00:00') AS DATETIME) FROM `reports` WHERE `reports`.`date` IS NOT NULL AND (`reports`.`date` <= '2007-05-23' AND `reports`.`date` BETWEEN '2007-01-01 00:00:00' AND '2007-12-31 23:59:59.999999') GROUP BY 1 ORDER BY 1 ASC SELECT `reports`.`id`,`... FROM `reports
My reports table is huge, but the datebased generic views shouldnt be loading the entire reporting table.
Especially not with make_object_list set to false.
Change History (8)
comment:1 by , 18 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 18 years ago
Resolution: | invalid |
---|---|
Status: | closed → reopened |
Fixed the False string. Doesn't change behavior.
Here is the traceback of the crash:
Traceback (most recent call last): File "/usr/lib/python2.4/site-packages/django/core/servers/basehttp.py", line 272, in run self.result = application(self.environ, self.start_response) File "/usr/lib/python2.4/site-packages/django/core/servers/basehttp.py", line 614, in __call__ return self.application(environ, start_response) File "/usr/lib/python2.4/site-packages/django/core/handlers/wsgi.py", line 189, in __call__ response = self.get_response(request) File "/usr/lib/python2.4/site-packages/django/core/handlers/base.py", line 111, in get_response return debug.technical_500_response(request, *sys.exc_info()) File "/usr/lib/python2.4/site-packages/django/views/debug.py", line 131, in technical_500_response return HttpResponseServerError(t.render(c), mimetype='text/html') File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 168, in render return self.nodelist.render(context) File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 705, in render bits.append(self.render_node(node, context)) File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 723, in render_node result = node.render(context) File "/usr/lib/python2.4/site-packages/django/template/defaulttags.py", line 122, in render nodelist.append(node.render(context)) File "/usr/lib/python2.4/site-packages/django/template/defaulttags.py", line 209, in render return self.nodelist_true.render(context) File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 705, in render bits.append(self.render_node(node, context)) File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 733, in render_node raise wrapped TemplateSyntaxError: Caught an exception while rendering: Original Traceback (most recent call last): File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 723, in render_node result = node.render(context) File "/usr/lib/python2.4/site-packages/django/template/defaulttags.py", line 122, in render nodelist.append(node.render(context)) File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 773, in render output = self.filter_expression.resolve(context) File "/usr/lib/python2.4/site-packages/django/template/__init__.py", line 579, in resolve obj = func(obj, *arg_vals) File "/usr/lib/python2.4/site-packages/django/template/defaultfilters.py", line 36, in _dec return func(*args, **kwargs) File "/usr/lib/python2.4/site-packages/django/template/defaultfilters.py", line 259, in escape return escape(value) File "/usr/lib/python2.4/site-packages/django/utils/html.py", line 28, in escape return html.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''') MemoryError
comment:3 by , 18 years ago
Resolution: | → invalid |
---|---|
Status: | reopened → closed |
A simple look at the code settles this. The archive_year function is clearly not creating object_list if make_object_list is false. It does have to extract all the data to get the dates, though, so this might be the cause of your problem. In any case, this isn't the bug you think it is. You might wish to ask on django-users, describing your model setup and data sizes to get help on managing the memory usage.
You may have also rediscovered a variant of #1453.
comment:4 by , 18 years ago
I am able to use the generic date view on other models and it does not query all of the data from the table. But on my Reports model, even after I cut it down, it still queries all the data in the table.
class Report(models.Model): date = models.DateField() class Meta: db_table = 'reports'
070524 12:29:44 35906 Query SELECT CAST(DATE_FORMAT(`reports`.`date`, '%Y-%m-01 00:00:00') AS DATETIME) FROM `reports` WHERE (`reports`.`date` <= '2007-05-24' AND `reports`.`date` BETWEEN '2007-01-01 00:00:00' AND '2007-12-31 23:59:59.999999') GROUP BY 1 ORDER BY 1 ASC 35906 Query SELECT `reports`.`id`,`reports`.`date` FROM `reports`
Ive looked in the source of the files mentioned in the trace above, but am not sure how to troubleshoot this next.
comment:5 by , 18 years ago
Making my own custom view works without the overhead of the generic date view.
def report_list(request): month_list = Report.objects.all().dates('date', 'month', order='DESC') return render_to_response('list/report.html', { "month_list": month_list, })
SELECT CAST(DATE_FORMAT(`reports`.`date`, '%Y-%m-01 00:00:00') AS DATETIME) FROM `reports` WHERE `reports`.`date` IS NOT NULL GROUP BY 1 ORDER BY 1 DESC
comment:6 by , 18 years ago
Resolution: | invalid |
---|---|
Status: | closed → reopened |
comment:7 by , 18 years ago
Summary: | generic view archive_year is always making and object_list even if false make_object_list → generic view archive_year is querying all objects, unexplained. |
---|
Let me know how I can troubleshoot this, or additional information I can provide.
comment:8 by , 18 years ago
Resolution: | → wontfix |
---|---|
Status: | reopened → closed |
The source of the sql queries was and exception happening that caused the django error page to evaluate the complete set.
It should be:
You were passing a string.