2017-07-27 90 views
0

我有2種型號:如何在Django模型中同步更新實例?

class TranslatedLesson(models.Model): 
created_at = models.DateTimeField(auto_now_add=True) 
updated_at = models.DateTimeField(auto_now=True) 
amount_steps = models.IntegerField(default=0) 

class TranslationStep(models.Model): 
lesson = models.ForeignKey(TranslatedLesson, on_delete=models.CASCADE, related_name="steps") 
created_at = models.DateTimeField(auto_now_add=True) 
updated_at = models.DateTimeField(auto_now=True) 


@receiver(post_save, sender=TranslationStep, 
dispatch_uid="update_lesson_date") 
def update_lesson_date(sender, instance, **kwargs): 
    lesson = instance.lesson 
    lesson.update_date = instance.updated_at 
    lesson.save() 

我每次更新TranslationStep模式,我想更新updated_at時間,這TranslatedLesson了。但是上面的代碼給了我不同的結果,因爲這一點還有點不足。即使我刪除auto_now=True並覆蓋.save方法,它也不會給出所需的結果。

>>> step.updated_at 
    datetime.datetime(2017, 7, 27, 7, 59, 24, 912420, tzinfo=<UTC>) 
>>> lesson.updated_at 
    datetime.datetime(2017, 7, 27, 7, 59, 24, 919461, tzinfo=<UTC>) 

如何同步執行更新?

+0

你能簡單地刪除'上TranslatiedLesson auto_now'屬性,而不會覆蓋'save'方法 - 剛剛離開'receiver'功能的地方做了工作? – an0o0nym

+0

@ an0o0nym問題是我需要在其他地方自動更新'updated_at' –

+0

您需要解釋爲什麼這很重要。當然,時代將會有所不同,任何事情都不可能真正同步發生。那麼你在什麼地方依靠時間完全相同呢?絕對肯定會是更好的方式。 –

回答

1

既然你想TranslatedLesson.save()自動update_date,你不能在這裏使用TranslatedLesson.save()。該解決方案是using QuerySet.update() instead繞過調用TranslatedLesson.save()

receiver(post_save, sender=TranslationStep, dispatch_uid="update_lesson_date") 
def update_lesson_date(sender, instance, **kwargs): 
    qs = TranslatedLesson.objects.filter(id=instance.lesson_id) 
    qs.update(updated_at=instance.updated_at) 
+0

我想知道,它是如何工作的,導致在Django文檔據說它甚至可以阻止競爭條件。 –

+0

正如文檔中提到的那樣,它通過發出直接的SQL更新查詢而不是通過模型層來工作 - 這也解釋了它如何防止某些競爭條件。 –

相關問題