在Django中,如何防止“使用update_fields保存不会影响任何行”。错误?

Dav*_*ave 10 django django-models python-3.x sql-update

我正在使用Django和Python 3.7。我有这个代码

article = get_article(id)
...
article.label = label
article.save(update_fields=["label"])
Run Code Online (Sandbox Code Playgroud)

有时我在“保存”行上收到以下错误...

    raise DatabaseError("Save with update_fields did not affect any rows.")
django.db.utils.DatabaseError: Save with update_fields did not affect any rows.
Run Code Online (Sandbox Code Playgroud)

显然,在“ ...”中,另一个线程可能正在删除我的文章。还有另一种方法可以重写我的“ article.save(...)”语句,以便如果该对象不再存在,则可以忽略引发的任何错误?

Lou*_*uis 6

一个评论由gachdavit使用建议select_for_update。您可以修改get_article函数以select_for_update在获取文章之前进行调用。这样,只要当前事务不提交或不回滚,保存该文章的数据库行将被锁定。如果另一个线程试图同时删除该文章,则该线程将阻塞直到释放锁。实际上,只有在调用该save函数之后,该文章才会被删除。

除非您有特殊要求,否则我将采用这种方法。