2014-03-26 48 views
1

我使用django創建視頻庫網站。Django - 更新保存在管理中的另一個模型

我有3個模型的圖書館:視頻,VideoTopic,和課程。

我有一個TimedeltaField在每個視頻的持續時間。在管理員保存每個視頻後,我希望獲得課程中所有視頻的每個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() 
+0

你只想更新它在管理員,或總是? – therewillbesnacks

+0

始終保持更新將是最好的。 – Renkai

+0

視頻需要與課程的關係。將'course = models.ForeignKey('Course')'添加到您的視頻模型。並保持更新不會是最好的。因爲你需要大量的代碼來跟蹤整個視頻的持續時間。閱讀關於數據庫標準化。總時間可以通過https://docs.djangoproject.com/en/dev/topics/db/aggregation/ – allcaps

回答

3

我建議你使用一個django signal。這將確保您的模型無論在哪裏更新(在應用程序,管理員等中)都是同步的。在視頻上註冊post save信號。在信號中,您將收到視頻實例。只需查詢VideoTopic和Course中的相​​關記錄,然後在那裏進行數學計算。如果你不想讓它失敗,我建議在交易中做所有這些事情。如果您不需要始終保持最新的信息,那麼也可以做一些後臺工作來減輕重量。

爲什麼是信號?

  • 中隔離涉及
  • 確保您的邏輯始終運行
  • 能幫分離的事從模型直接,如果有相關性,這可以減少對加載順序/循環依賴的一些情況。

另外,您可以簡單地覆蓋視頻模型的save方法,並在那裏做同樣的事情。無論哪種情況,如果您不想自己編寫查詢,只需在外鍵中使用ORM中的相關屬性即可。

+0

謝謝@therewillbesnacks我感謝您的幫助! – Renkai

相關問題