【问题标题】:Django: transaction.atomic in CreateView, form_valid()Django:CreateView 中的 transaction.atomic,form_valid()
【发布时间】:2018-11-09 10:56:47
【问题描述】:

在我的CreateView 中使用transaction.atomicform_valid 有意义吗?

    @transaction.atomic
    def form_valid(self, form):
        self.instance = form.save(commit=False)
        self.instance.event = self.request.event
        # When the super method is called the instance
        # is saved because it's a model form
        super().form_valid(form)
        return HttpResponseRedirect(self.get_success_url())

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果您的表单具有多对多字段,则事务装饰器将确保保存实例和多对多字段的查询在同一事务中运行。

    如果您的表单没有多对多字段,那么将有一个 SQL 查询来保存行并且不需要事务。

    顺便说一句,您的 return 声明复制了 super().form_valid(form) 会做的事情。您可以使用return super().form_valid(form),或者明确调用save() 可能更清楚。

    @transaction.atomic
    def form_valid(self, form):
        self.instance = form.save(commit=False)
        self.instance.event = self.request.event
        self.instance.save()
        self.instance.save_m2m()  # if you have m2m fields
        return HttpResponseRedirect(self.get_success_url())
    

    【讨论】:

    • 完美 + 你实际上向我展示了我在代码中犯的一个错误。我有 m2m 字段,但没有意识到它们没有保存。非常感谢。
    • 看过 Django 代码后,我认为 super().form_valid(form) 即使在您使用 commit=False 调用 save 之后也会保存 m2m 字段。但因为这对我来说不是很明显,所以我更愿意明确地调用 save()save_m2m()
    猜你喜欢
    • 2015-01-12
    • 2021-12-19
    • 2014-03-16
    • 1970-01-01
    • 2018-12-12
    • 2014-03-18
    • 2017-04-07
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多