Skip to main content
 首页 » 编程设计

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

2025年05月04日19freeliver54

我有一个管理表单,其中有几个用于显示 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特别是。