Django REST框架3个模型相互关联,删除请求失败

2024-10-01 10:11:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在删除一个模型(我们称之为a)的实例时遇到了一个问题,该模型有一个与by Foreign Key约束相关的另一个模型(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')

我的完美场景:我希望能够发送一个特定任务模型的删除请求,该请求将删除与其相关的每个步骤模型。你知道吗

我很感激任何帮助!你知道吗

回溯

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.

Tags: djangoinpyapivenvlibpackagessite