Rest Framework Tutorial IntegrityError creating snippets
django, django-rest-framework
Solution
I was running through this tutorial tonight and hit the same error. It seems the tutorial is a version or so behind the actual framework maybe? Regardless, I was able to get snippets to save after a bit of research.
Where the tutorial says to do this:
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
I switched to this:
def pre_save(self, snip):
snip.owner = self.request.user
It seems that that `perform_create` method no longer exists or is called, so the `owner` never gets set, thus the error we saw. I'm not sure if what I did is the correct way of solving the problem, but it seems to work!
Here's a link to the docs where I figured the above out: http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview
Problem
I am working my way through the Django Rest Framework tutorial and I am stuck on Part 4. After adding permissions to the views, it says to create a couple of snippets. I logged in through the browsable API and tried to post a snippet like this: ``` { "title": "snippet", "code": "print 123" } ``` When I do I get: IntegrityError at /snippets/ NOT NULL constraint failed: snippets_snippet.owner_id Anyone know what's going on here? ``` Traceback: File "/home/grez/restenv/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response 111. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/grez/restenv/lib/python3.4/site-packages/django/views/decorators/csrf.py" in wrapped_view 57. return view_func(*args, **kwargs) File "/home/grez/restenv/lib/python3.4/site-packages/django/views/generic/base.py" in view 69. return self.dispatch(request, *args, **kwargs) File "/home/grez/restenv/lib/python3.4/site-packages/rest_framework/views.py" in dispatch 403. response = self.handle_exception(exc) File "/home/grez/restenv/lib/python3.4/site-packages/rest_framework/views.py" in dispatch 400. response = handler(request, *args, **kwargs) File "/home/grez/web/resttutorial/snippets/views.py" in post 23. serializer.save() File "/home/grez/restenv/lib/python3.4/site-packages/rest_framework/serializers.py" in save 599. self.save_object(self.object, **kwargs) File "/home/grez/restenv/lib/python3.4/site-packages/rest_framework/serializers.py" in save_object 1041. obj.save(**kwargs) File "/home/grez/web/resttutorial/snippets/models.py" in save 36. super(Snippet, self).save(*args, **kwargs) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/models/base.py" in save 591. force_update=force_update, update_fields=update_fields) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/models/base.py" in save_base 619. updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/models/base.py" in _save_table 700. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/models/base.py" in _do_insert 733. using=using, raw=raw) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/models/manager.py" in manager_method 92. return getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/models/query.py" in _insert 921. return query.get_compiler(using=using).execute_sql(return_id) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/models/sql/compiler.py" in execute_sql 920. cursor.execute(sql, params) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/backends/utils.py" in execute 81. return super(CursorDebugWrapper, self).execute(sql, params) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/backends/utils.py" in execute 65. return self.cursor.execute(sql, params) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/utils.py" in __exit__ 94. six.reraise(dj_exc_type, dj_exc_value, traceback) File "/home/grez/restenv/lib/python3.4/site-packages/django/utils/six.py" in reraise 549. raise value.with_traceback(tb) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/backends/utils.py" in execute 65. return self.cursor.execute(sql, params) File "/home/grez/restenv/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py" in execute 485. return Database.Cursor.execute(self, query, params) Exception Type: IntegrityError at /snippets/ Exception Value: NOT NULL constraint failed: snippets_snippet.owner_id ```