python - Django 在 POST 请求中处理并发并保存所有请求
问题描述
我正在使用 Django Rest Framework 构建 REST API 应用程序。通过发布请求,我正在接收数据并将其与citizen_id 和import_id unique_together 一起保存(参见models.py)。每次保存的 Import_id 都是通过 get_current_import_id() 函数计算的(参见 views.py)对于并发请求,我使用“curl1 & curl2”命令可能我不了解一些基础知识,但我想要的是保存每个并发请求(每个新请求都应该使用以前的 import_id + 1)。我还在序列化程序中使用“current_import_id”值来创建和保存实例。
PS PATCH 和 GET 请求正在处理并发数据。例如,两个并发 PATCH 请求是随机保存的(有时“first”是第一个,有时“first”是第二个,但它有效)
POST 请求示例,JSON
{
"citizen_id": 1,
"name": "Foo",
}
模型.py
class CitizenInfo(models.Model):
citizen_id = models.PositiveIntegerField()
import_id = models.PositiveIntegerField()
name = models.CharField(max_length=256)
class Meta:
unique_together = ('import_id', 'citizen_id',)
views.py 获取数据库中的最大 import_id 并确定 current_import_id
def get_current_import():
previous_import_id = CitizenInfo.objects.aggregate(
Max('import_id'))['import_id__max']
if not previous_import_id:
previous_import_id = 0
current_import_id = previous_import_id + 1
return current_import_id
目前我从 POST "curl1 & curl2" 命令获得的结果状态是 201 和 500(由于随机性,有时是 500 和 201)。
顺便说一句,我已经尝试过 django F()
,select_for_update(nowait=True)
但它并没有像预期的那样有帮助
项目配置:Django + Gunicorn + Nginx
任何建议,请。
解决方案
感谢@azundo,我改变了我的models.py和一些逻辑,现在它可以工作了。
class ImportId(models.Model):
import_id = models.AutoField(primary_key=True)
class CitizenInfo(models.Model):
citizen_id = models.PositiveIntegerField()
import_id = models.ForeignKey(ImportId, on_delete=models.CASCADE)
name = models.CharField(max_length=256)
但我也面临
合意的行为
的 AutoField,正如它在另一个问题中所说的Django 模型实例主键在所有实例被删除后不会重置为 1。但我认为我的情况没问题。
推荐阅读
- node.js - 如何避免 DEADLINE_EXCEEDED 解析 firestore 数据库发送推送通知?
- python - 是否可以通过文本获取元素并使用 bs4 将其删除?
- wix - 可以关闭安装程序的控件
- python - 当 Celery Beat 发送一个到期任务时,为什么 MainProcess 收到了三个不同的任务?
- arrays - 带有二维数组的分段错误 shmat()
- delphi-7 - 快报4 Property DataOnly 不存在?
- python - 在破折号/情节中更改语言
- azure - 修改基本部署后未重新应用 Azure 边缘分层部署
- c++ - 使用c++11标准线程库时出现段错误
- java - 无法反序列化 `java.util.ArrayList 的实例
` 超出 START_OBJECT 令牌