如何在管理员中保存父项时保存相关的内联django模型?

时间:2013-08-11 03:34:08

标签: django django-models django-admin django-signals

在我的模型中,我有一个Event类,一个Volunteer类和一个Session类。 Session类具有Event和Volunteer的外键字段,并且是两者的唯一耦合,以及日期和时间。总的来说,志愿者和事件我认为在技术上有很多关系。

使用预先打包的Django管理员,我分别使用自己的admin.ModelAdmin类编辑志愿者和事件。会话在事件ModelAdmin中内联编辑。

当我在管理界面中向一个活动添加一个新会话时,我需要志愿者的hours字段自动更新,以反映新添加的会话持续多个小时(加上所有过去)会话)。目前,我只在calculate_hours模型中有一个Volunteer函数,每次调用它时都会迭代所有会话,并找到小时的总和。我尝试在Session中使用自定义保存功能调用它,但它似乎永远不会在事件保存功能之后调用。我会在活动中尝试一下,但我无法分析哪些志愿者需要重新计算他​​们的时间。如果我手动转到志愿者管理页面,编辑,然后保存志愿者,则会更新小时字段,但这是非常不可接受的。

我发现在管理站点上保存内联对象时,有很多关于Django问题的问题,特别是对于ManyToMany字段。在阅读了很多这些问题后,我不确定,如果他们说的话适用于我的情况 - 也许我需要在某个地方收到信号,或者在特殊地方包含自定义保存,或者拨打save_model进入我的admin.ModelAdmin课......我只是不知道。最好的方法是什么?

可以在此处找到代码:Models.pyAdmin.py

1 个答案:

答案 0 :(得分:1)

首先,您所描述的关系是称为“通过”的ManyToMany(您可以在文档here中阅读它)。

其次,我不明白为什么你需要'小时'才能成为一个领域。这个功能不够用吗?为什么首先将它保存在数据库中?你可以在每次需要时调用它。

最后,在我看来,你做了很多我不理解的额外工作 - 为什么你需要志愿者时间布尔字段?如果你将一名志愿者与一个活动联系起来并不足以让他知道他在那里?那些“counts_towards_volunteer_time”的目的是什么?我可能在这里错过了一些逻辑,但其中很多都是浪费。