Django - 在admin中保存更新另一个模型

时间:2014-03-26 17:07:31

标签: python django

我正在使用django创建一个视频库网站。

我有3个模型库:Video,VideoTopic和Course。

我在每个视频的持续时间内都有一个TimedeltaField。在admin中保存每个视频后,我想获得课程中所有视频的每个TimedeltaField的总和,然后将该总和保存到我的课程模型中的TimedeltaField。

我正在使用django-timedeltafield,它将很好地处理摘要。我还没有找到解决方案是如何在管理员中保存每个视频后更新课程模型。有什么建议吗?

我的模型如下:

class Video(models.Model):
    title = models.CharField(max_length=200)
    topic = models.ForeignKey('VideoTopic')
    duration = timedelta.fields.TimedeltaField(default="3 minutes, 30 seconds", help_text="(x minutes, x seconds)")

class VideoTopic(models.Model):
    name = models.CharField(max_length=200, blank=True)
    course = models.ForeignKey('course.Course')

class Course(models.Model):
    name = models.CharField(max_length=200)
    duration = timedelta.fields.TimedeltaField()

2 个答案:

答案 0 :(得分:3)

我建议您使用django signal。这将确保您的模型同步,无论它们在何处更新(在应用程序,管理员等)。

在视频上注册post save信号。在信号中,您将收到视频实例。只需在VideoTopic和Course中查询其相关记录,然后在那里进行数学计算。如果您不想让它失败,我建议您在交易中完成所有这些操作。如果您不需要始终保持最新的信息,那么也可以进行一些后台工作,以节省更轻的重量。

为什么要发出信号?

  • 分开关注
  • 确保您的逻辑始终运行
  • 如果它具有依赖关系,可以帮助将事物直接从模型中解耦出来,这可以减少加载顺序/循环依赖关系的某些情况。

或者,您可以简单地覆盖视频模型的save方法并在那里执行相同的操作。在任何一种情况下,如果您不想自己编写查询,只需使用外键中ORM中的相关属性。

答案 1 :(得分:0)

另一种方法是覆盖admin save方法来更新课程模型。请参阅https://docs.djangoproject.com/en/dev/ref/contrib/admin/#modeladmin-methods