python - Django 管理后保存方法 - 怎么做?

标签 python django inline admin

我有一个管理表单,其中有几个用于显示 m2m 字段的内联,如下所示:

class ArticleAdmin(admin.ModelAdmin):
    form = ArticleCustomAdminForm
    inlines = (SpecificGemInline, SuiteInline,)

基类看起来像这样:

class Article(models.Model):
    article_code = models.CharField(max_length=15)
    gems = models.ManyToManyField(Gem, through='SpecificGem')

模型有一个特殊的字段 article_code 应该从两个内联中表示的 m2m 字段聚合一些数据,所以我写了一个函数 create_code(instance) 这样做通过直接访问模型实例字段,类似这样:

def create_code(instance):
    article_code_part1 = SpecificGem.objects.filter(article=instance)
    article_code_part2 = instance.suite_set.all()
    instance.article_code = #do something with both parts

问题是,当我从重写的 ModelAdmin 的 save_model() 或模型的 save() 函数调用此函数时,实例 m2m 字段会产生过时的结果。即使是下面的弱智示例也无济于事:

class ArticleAdmin(admin.ModelAdmin):
    #...
    def save_model(self, request, obj, form, change):
        obj.save()
        create_code(obj)
        obj.save()

当我进入 InlineFormset 的 clean() 方法时,我可以访问它的表单数据,因此我可以在没有实际保存的情况下计算出 article_code 的一部分...但我有两个内联。

那么我如何找到最顶层的保存方法,以便在所有模型都经过验证并保存到数据库后调用我的聚合函数?

最佳答案

为了捕获对 ManyToManyField 的更改,您需要连接 m2m_changed 信号。您可能想查看 signals 的文档一般和m2m_changed signal特别是。

关于python - Django 管理后保存方法 - 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604218/

相关文章:

python - 有什么方法可以在 python 中为 hashlib 使用非 openssl md5?

python - 根据列名分组

django - AWS 上的多容器 Docker

django - 在django中,models.ImageField默认采用哪种格式

C++ - 如何内联驻留在 .lib 中的函数?

c - 使用全局 C 变量的 IAR 内联汇编

python - 在 virtualenv 中通过 pip 安装 PyGObject

python - 使用 NLTK 的数据集行的 POS 标签

html - 在脚本标签中嵌入 JSON 对象

c - C中 `inline`关键字有什么用?