Rest框架教程IntegrityError创建代码片段

 春哥在奋斗_ 发布于 2022-12-09 16:37

我正在按照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类中排除。

1 个回答
  • 答案似乎取决于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类中排除。

    2022-12-11 02:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有