raagin/django-streamfield

Deleting object from stream causes error when contenttypes and streamblocks use different databases

Closed this issue · 2 comments

Deleting object from streamfield cause ProgrammingError.

Example traceback:

Traceback (most recent call last):
  File ".../site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File ".../site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File ".../site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File ".../site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File ".../site-packages/streamfield/views.py", line 58, in delete_instance
    obj = t.get_object_for_this_type(pk=pk)
  File ".../site-packages/django/contrib/contenttypes/models.py", line 168, in get_object_for_this_type
    return self.model_class()._base_manager.using(self._state.db).get(**kwargs)
    ...
    ...
  File ".../site-packages/MySQLdb/connections.py", line 254, in query
    _mysql.connection.query(self, query)
django.db.utils.ProgrammingError: (1146, "Table 'accounts.streamblocks_imagewithtext' doesn't exist")

The problem appears, because for my project contenttypes are in the accounts database, however streamblocks models are stored in the default. The t.get_object_for_this_type function runs queryset with .using(self._state.db), where self._state.db=="accounts".

I have prepared a fix, it worked for my project:
#30

Thank you! I merged it