环境

Python 3.7.6
Django 2.2.16

先后顺序

执行保存操作时,先执行 save_model,再执行保存数据的触发操作 post_save ,最后执行 save_related。若其中任何一个步骤出错,任何数据都不会被保存到数据库。

情况概述

  1. 无 ManyToManyField 多对多字段的 Model:在执行保存操作时,执行 post_save,正常。
  2. 有 ManyToManyField 多对多字段的 Model:在执行保存操作时,执行 post_save,会出现以下两种情况:
  • 若 post_save 操作中不需要获取或操作 ManyToManyField 多对多字段,则正常。
  • 若 post_save 操作中需要获取或操作 ManyToManyField 多对多字段,则错误,无法获取到 ManyToManyField 多对多字段的数据。因为此时 save_related 并没有被执行,ManyToManyField 多对多字段数据根本未被保存,则无法获取到数据。

解决

在 save_related 执行后,在执行某些操作。仅可实现部分操作。示例代码:

    def save_related(self, request, form, formsets, change):

        form.save_m2m()
        for formset in formsets:
            self.save_formset(request, form, formset, change=change)
        if not change: # 若 instance 实例被创建,则继续
            obj = form.instance # 获取 obj 实例
            pass

思维僵化

最初将 post_save 的理解为:在数据保存后,才会进行的操作。即,点了保存按钮后,数据写入数据库后,才会执行的操作。
遇到此问题时(post_save 无法获取到 ManyToMany 多对多字段的的数据),导致一直在所搜索 post_save 与 save_related
执行的先后,或者说怎么才能让 post_save 在 save_related 后执行。导致思维僵化,有了局限性,浪费了很多时间。。。
在喝了杯咖啡,聊了会天后,突然想起来,可以尝试在 save_related 之后将 ManyToMany 多对多字段的数据执行保存操作后,再在保存操作代码之后进行其他操作。

最后修改:2020 年 11 月 25 日 11 : 05 AM
如果觉得文章帮助了您,您可以随意赞赏。