TypeError, Direct assignment to the reverse side of a related set is prohibited. Use +.set() instead

2,170 views
Skip to first unread message

Mike Schmidt

unread,
Nov 12, 2018, 7:11:35 PM11/12/18
to Mezzanine Users
I created a new mezzanine project with the following software versions:
    Linux 4.18.17-041817-generic (Ubuntu 18.04 with newer kernel)
    MariaDB 10.1.34 (running fine after explicitly creating the database with utf8 character encoding)
    Python 3.6.6
    Django 2.0.9 (from pypi)
    Mezzanine 4.3.1 (from github, along with filebrowser-safe)

The only modifications I've made are changing the timezone in settings.py and changing the database dictionary in local_settings.py.

Everything seemed to work. 'python manage.py createdb' was successful, then 'python manage.py runserver 127.0.0.1:8000' was also successful.

I logged into the admin interface, navigated to add a new richtext page, filled in the title and body, and clicked save. A debug-friendly error page was then returned, and the following text was in the console.

    [12/Nov/2018 14:28:08] "POST /admin/admin_keywords_submit/ HTTP/1.1" 200 1
    Internal Server Error: /admin/pages/richtextpage/add/
    Traceback (most recent call last):
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
        response = get_response(request)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
        response = self.process_exception_by_middleware(e, request)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 575, in wrapper
        return self.admin_site.admin_view(view)(*args, **kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
        response = view_func(request, *args, **kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 223, in inner
        return view(request, *args, **kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/mezzanine/pages/admin.py", line 66, in add_view
        return super(PageAdmin, self).add_view(request, **kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1554, in add_view
        return self.changeform_view(request, None, form_url, extra_context)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py", line 62, in _wrapper
        return bound_func(*args, **kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/utils/decorators.py", line 58, in bound_func
        return func.__get__(self, type(self))(*args2, **kwargs2)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1451, in changeform_view
        return self._changeform_view(request, object_id, form_url, extra_context)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1492, in _changeform_view
        self.save_related(request, form, formsets, not add)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1049, in save_related
        form.save_m2m()
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/forms/models.py", line 439, in _save_m2m
        f.save_form_data(self.instance, cleaned_data[f.name])
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/mezzanine/generic/fields.py", line 206, in save_form_data
        super(KeywordsField, self).save_form_data(instance, data)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 838, in save_form_data
        setattr(instance, self.name, data)
      File "/home/mike/projects/plab/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 509, in __set__
        % self._get_set_deprecation_msg_params(),
    TypeError: Direct assignment to the reverse side of a related set is prohibited. Use +.set() instead.
    [12/Nov/2018 14:28:08] "POST /admin/pages/richtextpage/add/ HTTP/1.1" 500 146350

Attempting to debug this in pycharm, I found that the item being saved was a 'keyword' of ''. I had not entered any keywords in the form, so it appears the empty string is saved, anyway. I've read through both django and mezzanine code in the callstack, and it seems like this is related to django's database layer and ManyToMany relationships. But it seems the ultimate saving of the empty keyword is a Field.setattr() call, which is neither an = or a .set(). And I don't know what the '+' character is from.

Can anyone help me to understand what needs to be fixed, here? Since I haven't actually written any code, I'm tempted to think either mezzanine or django needs a pull request. Or perhaps there's a compatibility issue between versions of django and mezzanine? I haven't seen anything obvious in git diffs. But until I understand better, I wouldn't know how to go about fixing it. I have found a few slightly similar things in this group and on stackexchange, but nothing that matches. The same behavior occurs if I run the server and try to add a blog post rather than a richtextpage. And I get the same behavior on a different server running debian 8 rather than ubuntu 18.

Thanks for any advice!

Stephen McDonald

unread,
Nov 12, 2018, 7:36:12 PM11/12/18
to mezzani...@googlegroups.com

I believe the GitHub version of Mezzanine had the maximum supported Django version changed to 2.0 prematurely, although there's been a ton of compatibility work done and the issue you're looking at is the last known problem with Django 2.0. Once that's resolved we can do a new official release supporting 2.0.

I don't have any insight to the cause of the issue nor any immediate availability to look at it myself.


--
You received this message because you are subscribed to the Google Groups "Mezzanine Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mezzanine-use...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


--
Stephen McDonald
http://jupo.org

Mike Schmidt

unread,
Nov 13, 2018, 8:25:22 AM11/13/18
to Mezzanine Users
Thank you for your reply, and I'm sorry I didn't see the open issue before posting.

I can't promise a resolution, but I'll continue looking and testing.

For further information, this same issue also occurs with postgresql, as I'd expect if it's occurring where I think it is. And I'm able to save site settings to the database, just not new blogs or richtextpages.

Cheers,
    Mike
Reply all
Reply to author
Forward
0 new messages