python - 如何在Django模型中同步更新实例?

标签 python django time synchronization

我有 2 个型号:

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>)

如何同步更新?

最佳答案

由于您希望 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)

关于python - 如何在Django模型中同步更新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45345407/

相关文章:

python - 轮询文件更改如何工作?

python - 外键中的 Django 模型计数

html - 具有上下文变量的特殊符号

django - 当 DEBUG = True 时,为什么断言会记录在 Sentry 中?

android - 时间格式根据手机时间设置更改

date - 以 UTC 存储时间总是一个好主意,还是在这种情况下以本地时间存储更好?

python - 如何对两个列表 N 元素求和

Python根据值从字典列表中删除重复项

django - 如何在 django 中运行后台任务,完成后,我可以将信息推送到前端。

performance - 优化 Netlogo 代码 - 每次运行的刻度太多?