Django处理POST请求中的并发并保存所有请求

时间:2019-08-25 04:18:43

标签: python django nginx django-rest-framework gunicorn

我正在使用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”值来创建和保存实例。

P.S PATCH和GET请求正在处理并发数据。例如,两个并发的PATCH请求被随机保存(有时“ first”是第一个,有时“ first”是第二个,但是有效)

POST请求示例,JSON

{
 "citizen_id": 1,
 "name": "Foo",
}

models.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

请提出任何建议。

1 个答案:

答案 0 :(得分:0)

由于@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)

但我也面对

  

理想的行为

正如在另一个问题Django model instances primary keys do not reset to 1 after all instances are deleted中所说的,是AutoField的

。但我认为我的情况还可以。