django update model不会影响auto_now时间戳

时间:2016-07-04 17:50:03

标签: django-models

我一直在尝试调试为什么我的几个模型中的last_updated字段在例如 for(size_t kk = 0; kk < n; kk += BLOCK) { for(size_t jj = 0; jj < n; jj += BLOCK) { for(size_t i = 0; i < n; ++i) { for(size_t k = kk; k < kk + BLOCK; ++k) { int r = a[i][k]; for(size_t j = jj; j < jj + BLOCK; ++j) { c[i][j] += r * b[k][j]; } } } } } 时没有更新,例如:

model.objects.filter(**lookups).update(**defaults)

这里我只是尝试更新单个条目,而不需要将实例加载到内存中。这似乎是一个无法解决的问题,在docshttps://code.djangoproject.com/ticket/15566中解释了'bug'(出于某种原因,我无法在文档中看到它)。

但是,更新单行的最佳方法是什么,包括last_updated字段(无需加载到内存中)?

2 个答案:

答案 0 :(得分:5)

它不适用于此问题中发布(声明为无法修复)https://code.djangoproject.com/ticket/22981

.update()只会更新显式传递给它的字段,因此不会更新auto_now = True的datetimefields。

答案 1 :(得分:0)

我知道记录的行为是.update()将忽略更新auto_now[_add]字段,这也由Yunti的回答所证实。但是,对于那些希望强制达到预期效果的人-例如,将auto_now字段作为.update()调用的一部分进行更新,以下方法似乎有效...

update(field1=val1, field2=val2,..., last_update=datetime.now())

其中last_update是带有(或不带有)models.DateTime的{​​{1}}类型的字段。但是,请注意,如果将auto_now=True以外的其他值(当前时间戳)传递给此字段,则ORM不会将其更正为当前时间戳(这就是now()标志语义暗示)。因此,例如,在以下代码段中,auto_now字段的确会被指定的时间戳覆盖,无论它是过去,现在还是将来...

last_update

因此,如果您希望在调用 update(field1=val1, field2=val2,..., last_update=datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p')) 时强制使用auto_now的标准语义,请确保正确将当前时间戳作为更新值传递给这些领域。您正在手动执行此操作(由于Django ORM实现中存在缺陷/不足),但是您这样做是正确的。