【问题标题】:How to save a related, inline django model when parent is saved in the admin?当父级保存在管理员中时,如何保存相关的内联 django 模型?
【发布时间】:2013-08-12 16:08:52
【问题描述】:

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

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

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

我看到在管理站点上保存内联对象时有很多关于 Django 问题的问题,特别是对于 ManyToMany 字段。在阅读了许多这些问题之后,我不确定他们所说的是否适用于我的情况——也许我需要在某处接收信号,或者在特殊位置包含自定义保存,或者在我的 @ 中调用 save_model 987654332@ class...我只是不知道。解决此问题的最佳方法是什么?

代码可以在这里找到:Models.py, Admin.py

【问题讨论】:

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


    【解决方案1】:

    首先,您所描述的关系是所谓的多对多“通过”(您可以在文档here 中了解它)。

    其次,我完全不明白为什么您需要将“小时”作为一个字段。一个功能还不够吗?为什么首先将其保存在数据库中?您可以在每次需要时调用它。

    最后,在我看来,你做了很多我不明白的额外工作——你为什么需要志愿者时间布尔字段?如果您将志愿者与活动联系起来,还不足以知道他在那里吗? “counts_towards_volunteer_time”的目的是什么?我可能在这里遗漏了一些逻辑,但其中很多似乎很浪费。

    【讨论】:

    • 感谢您的回复。所以我需要在我的 Event 类上明确定义一个ManyToManyField?到目前为止,我只是使用Event.session_set 等相关字段来获取我的所有数据,并且它似乎可以工作。除了这个节省的东西。老实说,我希望小时字段最终不会让我每次都重复每个会话,因为我正在使用的数据有一些历史悠久的志愿者。不过,我最初将其设置为仅调用该函数。 volunteer_time 字段表示会话是否计入hours
    • 您不必明确定义它,但它有一些优点(查询方面)。至于“小时”字段,我还是不明白为什么要保存在数据库中。您可以只使用该功能(如果您想进行查询,只需在列表理解中进行:[v.calc_hours() for v in Volunteer.objects.all()]
    • 对,但是假设一个志愿者有 1000 个会话与他们相关联。为什么每次保存单个会话时都要遍历每个会话?我可以改为将会话长度的值添加到已经存储的小时值中,而不必每次都做所有的跑腿工作。
    • 我现在将尝试将会话重新组织为多对多“通过”字段。我很怀疑,但也许它会解决我的储蓄问题。
    • 在 python zen 中,简单胜于复杂。顺便说一句,当您决定扩展项目时,请查找一个名为 django-dilla 的包。这是向您的数据库发送垃圾邮件的方法。我没有任何经验,但它应该是测试像 calc_hours 这样的查询如何处理大量条目的好方法
    猜你喜欢
    • 2012-02-27
    • 2018-07-23
    • 2022-10-24
    • 2011-03-30
    • 2016-01-23
    • 2019-08-22
    • 2014-07-11
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多