如何处理保存到Django模型时的网络错误

bis0qfac  于 2022-12-14  发布在  Go
关注(0)|答案(2)|浏览(135)

我有一个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()
bvn4nwqk

bvn4nwqk1#

使用bulk_create/bulk_update执行单个DB查询,或者使用transaction.atomic作为函数的装饰器,以便保存时的任何错误都将在函数运行之前回滚数据库。
尝试类似下面的内容(我假设您的模型名称是DebitJournal,而debit_journals是一个列表)。

for debit_journal in debit_journals:
    debit_journal.approval_no = journal_transaction_id
    debit_journal.approval_status = 'approved'

DebitJournal.objects.bulk_update(debit_journals, ["approval_no", "approval_status"])

如果debit_journalsQuerySet,您还可以尝试

debit_journals.update(approval_no=journal_transaction_id, approval_status='approved').
xggvc2p6

xggvc2p62#

这取决于你称之为网络错误,是用户和django应用之间的错误,还是django应用和数据库之间的错误.如果只是用户和应用之间的错误,请注意如果请求被正确发送,即使用户后来失去了连接,对象也会被创建.所以用户可能没有请求响应,但对象仍然会被创建.
如果它位于数据库和django应用程序之间,那么在错误发生之前,可能还创建了一些对象。
通常,如果您想要“All or Nothing”(全有或全无)行为,则应使用此处所述的手动事务:https://docs.djangoproject.com/en/4.1/topics/db/transactions/
请注意,如果创建时间很长,您可能会遇到请求超时。如果创建时间超过几秒钟,您应该考虑将其设置为后台任务。请求仅用于创建任务。
有关第三方解决方案,请参见Python task queue alternatives and frameworks

相关问题