Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

compiler.py allows for Multiquery with keys_only #100

Open
manubotija opened this issue Feb 7, 2015 · 0 comments
Open

compiler.py allows for Multiquery with keys_only #100

manubotija opened this issue Feb 7, 2015 · 0 comments

Comments

@manubotija
Copy link

Deleting one object from the Admin Panel from which two or more objects depend on, results on an error at compiler.py because it is trying to do a multiquery with keys_only which is forbidden by GAE

#!python

Environment:


Request Method: POST
Request URL: http://localhost:8000/admin/frontend/project/5471719615627264/delete/

Django Version: 1.5.8
Python Version: 2.7.5
Installed Applications:
('django.contrib.auth',
 'registration',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'djangotoolbox',
 'autoload',
 'dbindexer',
 'frontend',
 'djangoappengine')
Installed Middleware:
('google.appengine.ext.appstats.recording.AppStatsDjangoMiddleware',
 'autoload.middleware.AutoloadMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/Users/manubotija/Dev/repos/js3.0/django/core/handlers/base.py" in get_response
  113.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/contrib/admin/options.py" in wrapper
  372.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/views/decorators/cache.py" in _wrapped_view_func
  89.         response = view_func(request, *args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/contrib/admin/sites.py" in inner
  202.             return view(request, *args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/utils/decorators.py" in _wrapper
  25.             return bound_func(*args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/utils/decorators.py" in bound_func
  21.                 return func(self, *args2, **kwargs2)
File "/Users/manubotija/Dev/repos/js3.0/django/db/transaction.py" in inner
  223.                 return func(*args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/contrib/admin/options.py" in delete_view
  1333.             self.delete_model(request, obj)
File "/Users/manubotija/Dev/repos/js3.0/django/contrib/admin/options.py" in delete_model
  746.         obj.delete()
File "/Users/manubotija/Dev/repos/js3.0/django/db/models/base.py" in delete
  698.         collector.delete()
File "/Users/manubotija/Dev/repos/js3.0/django/db/models/deletion.py" in decorated
  62.             func(self, *args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/django/db/models/deletion.py" in delete
  293.             qs._raw_delete(using=self.using)
File "/Users/manubotija/Dev/repos/js3.0/django/db/models/query.py" in _raw_delete
  562.         sql.DeleteQuery(self.model).delete_qs(self, using)
File "/Users/manubotija/Dev/repos/js3.0/django/db/models/sql/subqueries.py" in delete_qs
  84.         self.get_compiler(using).execute_sql(None)
File "/Users/manubotija/Dev/repos/js3.0/djangotoolbox/db/basecompiler.py" in execute_sql
  641.             self.build_query([self.query.get_meta().pk]).delete()
File "/Users/manubotija/Dev/repos/js3.0/djangoappengine/db/compiler.py" in _func
  72.             return func(*args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/djangoappengine/db/compiler.py" in delete
  169.             keys = [key_dict[self.query.get_meta().pk.column] for key_dict in self.fetch()]
File "/Users/manubotija/Dev/repos/js3.0/djangoappengine/db/compiler.py" in fetch
  108.         query = self._build_query()
File "/Users/manubotija/Dev/repos/js3.0/djangoappengine/db/compiler.py" in _func
  72.             return func(*args, **kwargs)
File "/Users/manubotija/Dev/repos/js3.0/djangoappengine/db/compiler.py" in _build_query
  325.             return MultiQuery(self.gae_query, self.ordering)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore.py" in __init__
  2024.             'MultiQuery does not support keys_only.')

Exception Type: DatabaseError at /admin/frontend/project/5471719615627264/delete/
Exception Value: MultiQuery does not support keys_only.

This workaround solves the issue but it is a bad solution since it makes all queries not keys_only by default and therefore increases quota usage:


diff --git a/djangoappengine/db/compiler.py b/djangoappengine/db/compiler.py
index c2a5301..f2af272 100644
--- a/djangoappengine/db/compiler.py
+++ b/djangoappengine/db/compiler.py
@@ -96,7 +96,7 @@ class GAEQuery(NonrelQuery):
         start_cursor = getattr(self.query, '_gae_start_cursor', None)
         end_cursor = getattr(self.query, '_gae_end_cursor', None)
         self.config = getattr(self.query, '_gae_config', {})
-        self.gae_query = [Query(self.db_table, keys_only=self.pks_only,
+        self.gae_query = [Query(self.db_table, keys_only=False,
                                 cursor=start_cursor, end_cursor=end_cursor)]

     # This is needed for debugging.
@@ -301,7 +301,7 @@ class GAEQuery(NonrelQuery):
         for query in gae_query:
             for op, value in op_values:
                 self.gae_query = [Query(self.db_table,
-                                        keys_only=self.pks_only)]
+                                        keys_only=False)]
                 self.gae_query[0].update(query)
                 self._add_filter(field, op, value)
                 combined.append(self.gae_query[0])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant