我有一个只能使用get_or_create(session=session)访问的Django模型,其中session是另一个Django模型的外键.

因为我只能通过get_or_create()访问,所以我可以想象,我只有一个实例具有会话密钥.但是,我发现多个实例具有同一会话的密钥.发生了什么事?这是一个竞赛条件,还是get_or_create()是原子运行的?

推荐答案

实际上它不是线程安全的,您可以查看QuerySet对象的get_or_create方法的代码,它的基本功能如下:

try:
    return self.get(**lookup), False
except self.model.DoesNotExist:
    params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
    params.update(defaults)
    obj = self.model(**params)
    sid = transaction.savepoint(using=self.db)
    obj.save(force_insert=True, using=self.db)
    transaction.savepoint_commit(sid, using=self.db)
    return obj, True

因此,在连续保存实例之前,两个线程可能会发现数据库中不存在该实例,并开始创建一个新实例.

Django相关问答推荐

Django和静态文件

Django 根据子级过滤父级

从多个数据库访问 Django 会话

Django REST框架中如何从另一个视图调用API视图?

Django 在模型中存储用户图像

DeleteView 中的success_message 未显示

如何在 Django 视图中获取 URL 参数?

为什么 django 1.7 会为字段 Select 的变化创建迁移?

Django 1.9:字段与父模型中不存在的字段的字段冲突

如何在 Django 中返回静态 HTML 文件作为响应?

如何在python中遍历httprequest post变量

在python中查找对对象的所有引用

从 virtualenv 中,pip freeze > requirements.txt 给出了一堆垃圾!如何修剪它?

Python 社区里的小马是怎么回事?

在 Django 中舍入小数点

如何向所有 Django 响应添加 HTTP 标头

django 模板列表变量中的最后一个元素

如何 suppress Django 中的弃用警告?

django.core.servers.basehttp.FileWrapper 在 Django 1.9 中消失

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件