首页 > 解决方案 > Django REST framework - 3 个模型相互关联,DELETE 请求失败

问题描述

我在删除模型实例(我们称之为 A)时遇到问题,该实例具有与 A 相关的另一个模型 (B) 的实例(通过外键约束),并且无法删除。它使用 CASCADE 参数,但是我得到响应 500,它在回溯中只是说服务器已崩溃/数据库进入恢复模式。

以下是我的代码:

视图.py

class TaskInstance(generics.RetrieveUpdateDestroyAPIView):
    """
    Returns Task instance
    """
    queryset = Task.objects.all()
    serializer_class = TaskSerializer

class StepList(generics.ListCreateAPIView):
    """
    List all Steps (OR for specified task), or create a new one
    """
    queryset = Step.objects.all()
    serializer_class = StepSerializer
    filter_fields = ('task',)

模型.py

class Category(models.Model):
    name = models.CharField(max_length=25, blank=False)

    class Meta:
        ordering = ('id',)


class Task(models.Model):
    name = models.CharField(max_length=25, blank=False)
    cat = models.ForeignKey(Category, related_name='tasks', on_delete=models.CASCADE)

    class Meta:
        ordering = ('id',)


class Step(models.Model):
    name = models.CharField(max_length=25, blank=False)
    completed = models.BooleanField(blank=True, default=False)
    task = models.ForeignKey(Task, related_name='steps', on_delete=models.CASCADE)

    class Meta:
        ordering = ('id',)

序列化程序.py

class CategorySerializer(serializers.ModelSerializer):
    tasks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = Category
        fields = ('id', 'name', 'tasks')


class TaskSerializer(serializers.ModelSerializer):
    steps = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = Task
        fields = ('id', 'name', 'steps')


class StepSerializer(serializers.ModelSerializer):
    task = serializers.PrimaryKeyRelatedField(queryset=Task.objects.all(), many=False)
    class Meta:
        model = Step
        fields = ('id', 'name', 'completed')

我的完美场景:我希望能够为特定的 Task 模型发送 DELETE 请求,该请求会删除与之相关的每个 Step 模型。

我会很感激任何帮助!

追溯

OperationalError at /task/1/
server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.


Request Method: DELETE
Request URL: http://localhost:7000/task/1/
Django Version: 2.1.3
Python Executable: C:\Users\vaida\Documents\Coding\android-tm-api\venv\Scripts\python.exe
Python Version: 3.7.1
Python Path: ['C:\\Users\\vaida\\Documents\\Coding\\android-tm-api\\android_tm_api', 'C:\\Users\\vaida\\Documents\\Coding\\android-tm-api\\venv\\Scripts\\python37.zip', 'C:\\Users\\vaida\\Documents\\Coding\\android-tm-api\\venv\\DLLs', 'C:\\Users\\vaida\\Documents\\Coding\\android-tm-api\\venv\\lib', 'C:\\Users\\vaida\\Documents\\Coding\\android-tm-api\\venv\\Scripts', 'c:\\users\\vaida\\appdata\\local\\programs\\python\\python37\\Lib', 'c:\\users\\vaida\\appdata\\local\\programs\\python\\python37\\DLLs', 'C:\\Users\\vaida\\Documents\\Coding\\android-tm-api\\venv', 'C:\\Users\\vaida\\Documents\\Coding\\android-tm-api\\venv\\lib\\site-packages']
Server time: Fri, 16 Nov 2018 20:05:14 +0000
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'api.apps.ApiConfig',
 'django_filters']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Traceback:

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in _commit
  239.                 return self.connection.commit()

The above exception (server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
) was the direct cause of the following exception:

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\transaction.py" in __exit__
  212.                         connection.commit()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in commit
  261.         self._commit()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in _commit
  239.                 return self.connection.commit()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\utils.py" in __exit__
  89.                 raise dj_exc_value.with_traceback(traceback) from exc_value

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in _commit
  239.                 return self.connection.commit()

During handling of the above exception (server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
), another exception occurred:

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in ensure_connection
  216.                 self.connect()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in connect
  194.         self.connection = self.get_new_connection(conn_params)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\postgresql\base.py" in get_new_connection
  178.         connection = Database.connect(**conn_params)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\psycopg2\__init__.py" in connect
  130.     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

The above exception (server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
) was the direct cause of the following exception:

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\views\generic\base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\rest_framework\views.py" in dispatch
  495.             response = self.handle_exception(exc)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\rest_framework\views.py" in handle_exception
  455.             self.raise_uncaught_exception(exc)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\rest_framework\views.py" in dispatch
  492.             response = handler(request, *args, **kwargs)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\rest_framework\generics.py" in delete
  293.         return self.destroy(request, *args, **kwargs)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\rest_framework\mixins.py" in destroy
  93.         self.perform_destroy(instance)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\rest_framework\mixins.py" in perform_destroy
  97.         instance.delete()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\models\base.py" in delete
  880.         return collector.delete()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\models\deletion.py" in delete
  306.                             sender=model, instance=obj, using=self.using

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\transaction.py" in __exit__
  256.                     connection.set_autocommit(True)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in set_autocommit
  394.         self.ensure_connection()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in ensure_connection
  216.                 self.connect()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\utils.py" in __exit__
  89.                 raise dj_exc_value.with_traceback(traceback) from exc_value

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in ensure_connection
  216.                 self.connect()

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\base\base.py" in connect
  194.         self.connection = self.get_new_connection(conn_params)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\django\db\backends\postgresql\base.py" in get_new_connection
  178.         connection = Database.connect(**conn_params)

File "C:\Users\vaida\Documents\Coding\android-tm-api\venv\lib\site-packages\psycopg2\__init__.py" in connect
  130.     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

Exception Type: OperationalError at /task/1/
Exception Value: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

标签: pythondjangopython-3.xdjango-rest-frameworkdjango-views

解决方案


过了一会儿,我发现我以错误的方式解决问题......这不是代码的错 - 它工作正常。问题与通过 pgAdmin 设置的数据库有关。一旦删除并重新迁移 Django 项目,一切似乎都运行良好。


推荐阅读