我有一个Django .save()
的执行,它会循环n
次。我关心的是如何防止保存过程中的网络错误,因为有些条目可能会被保存,而有些则不会。确保执行完成的最佳方法是什么?
下面是我的代码示例
# SAVE DEBIT ENTRIES
for i in range(len(debit_journals)):
# UPDATE JOURNAL RECORD
debit_journals[i].approval_no = journal_transaction_id
debit_journals[i].approval_status = 'approved'
debit_journals[i].save()
2条答案
按热度按时间bvn4nwqk1#
使用
bulk_create
/bulk_update
执行单个DB查询,或者使用transaction.atomic
作为函数的装饰器,以便保存时的任何错误都将在函数运行之前回滚数据库。尝试类似下面的内容(我假设您的模型名称是
DebitJournal
,而debit_journals
是一个列表)。如果
debit_journals
是QuerySet
,您还可以尝试xggvc2p62#
这取决于你称之为网络错误,是用户和django应用之间的错误,还是django应用和数据库之间的错误.如果只是用户和应用之间的错误,请注意如果请求被正确发送,即使用户后来失去了连接,对象也会被创建.所以用户可能没有请求响应,但对象仍然会被创建.
如果它位于数据库和django应用程序之间,那么在错误发生之前,可能还创建了一些对象。
通常,如果您想要“All or Nothing”(全有或全无)行为,则应使用此处所述的手动事务:https://docs.djangoproject.com/en/4.1/topics/db/transactions/
请注意,如果创建时间很长,您可能会遇到请求超时。如果创建时间超过几秒钟,您应该考虑将其设置为后台任务。请求仅用于创建任务。
有关第三方解决方案,请参见Python task queue alternatives and frameworks。