如何在 Django REST 框架中使用事务?

Posted

技术标签:

【中文标题】如何在 Django REST 框架中使用事务?【英文标题】:How to use transactions with Django REST framework? 【发布时间】:2017-02-22 12:07:10 【问题描述】:

我希望使用 Django REST 框架“一起”创建多个模型对象——即在单个事务中。

目标是每个对象仅在事务(成功)结束时可见。

我该怎么做?

【问题讨论】:

【参考方案1】:

django.db.transaction 中的atomic 用作围绕执行您所追求的数据库操作的函数的装饰器:

如果obj_list 包含已填充(但未保存)模型对象的列表,这将作为一个事务的一部分执行所有操作。

@atomic def save_multiple_objects(obj_list): for o in obj_list: o.save()

如果您想将多个对象保存为同一个 API 请求的一部分,那么(例如)如果它们都是同一类型,那么您可以将对象列表发布到 API 端点 - 请参阅Django REST framework post array of objects

【讨论】:

【参考方案2】:

您可以使用django db transactions 实现此目的。参考下面的代码

from django.db import transaction

with transaction.atomic():
    model_instance = form.save(commit=False)
    model_instance.creator = self.request.user
    model_instance.img_field.field.upload_to = 'directory/'+model_instance.name+'/logo'
    self.object = form.save()

这个例子取自我自己对这个SO post 的回答。这样,before calling save() you can save/edit other dependencies

【讨论】:

以上是关于如何在 Django REST 框架中使用事务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中为枚举字段创建序列化程序

使用 django rest 框架,如何为现有父对象添加新的嵌套子对象

ModelSerializer 在 Django REST 框架中非常慢

如何在 django rest 框架中访问获取请求数据

如何知道哪个用户被分配给了令牌(JWT Django rest 框架)?

你如何在 django rest 框架中实现 CSRF 令牌?