我正在按照Django Rest Framework教程的方式进行工作,我只停留在第4部分。
向视图添加权限后,它说要创建几个片段。我通过可浏览的API登录,并尝试发布如下代码段:
{ "title": "snippet", "code": "print 123" }
当我得到时:
/ snippets /中的IntegrityError
NOT NULL约束失败:snippets_snippet.owner_id
有人知道这是怎么回事吗?
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
小智.. 5
答案似乎取决于Django REST框架版本。下面的答案已经在3.2.4和3.10.3版上进行了测试。如果使用这些版本和基于类的视图,则应输入:
serializer.save(owner=self.request.user)
代替
serializer.save()
在SnippetList.post()方法中,因此其外观如下:
def post(self, request, format=None): serializer = SnippetSerializer(data=request.data) if serializer.is_valid(): serializer.save(owner=self.request.user) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
函数pre_create()应该从SnippetList类中排除。
答案似乎取决于Django REST框架版本。下面的答案已经在3.2.4和3.10.3版上进行了测试。如果使用这些版本和基于类的视图,则应输入:
serializer.save(owner=self.request.user)
代替
serializer.save()
在SnippetList.post()方法中,因此其外观如下:
def post(self, request, format=None): serializer = SnippetSerializer(data=request.data) if serializer.is_valid(): serializer.save(owner=self.request.user) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
函数pre_create()应该从SnippetList类中排除。