python - 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.
解决方案
过了一会儿,我发现我以错误的方式解决问题......这不是代码的错 - 它工作正常。问题与通过 pgAdmin 设置的数据库有关。一旦删除并重新迁移 Django 项目,一切似乎都运行良好。
推荐阅读
- java - 仅当目标的字段为空时,MapStruct 将字段映射到目标
- java - 将确认传递给 Spring KafkaListener 消费者方法
- workflow - Workflow-Core 与 ElsaCore
- keras - 在每个 epoch 之后,准确性保持不变
- node.js - 为什么两个进程之间的管道数据在太大时似乎被截断?
- android - 使用 Firebase 的 orderbychild() 时不必要地获取大数据?
- perl - ServiceNow 的 Perl API 停止支持 TLS 1.0 和 1.1。是否有任何快速的 Perl 5.8 修复?
- c# - MVC 控制器的参数始终为空
- limit - Anylogic限制区域限制会导致错误并在模型崩溃时显示-1仍在限制范围内
- python - OpenCV w/Tkinter:滞后和窗口问题