4

当使用它的 save 方法保存 django 模型时,有没有办法确保在保存过程中没有发生任何事情并向用户发送消息?我在考虑消息框架并尝试除块?

try:
    model.save()
    add success message to message framework
except DatabaseError:
    add error message to message framework
except TransactionManagementError:
    add error message

这是正确的方法吗?还有在尝试保存模型的新实例时更有可能引发哪个异常?我对 django 相当陌生,所以请善待:)

4

2 回答 2

3

我的方法是使用我的所有模型都扩展的基本抽象模型,并在其中覆盖 save 方法以捕获异常和回滚事务:

class AbstractModel(models.Model):
    class Meta:
        abstract = True

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        try:
            super(AbstractModel, self).save(force_insert, force_update, using, update_fields)
        except IntegrityError as saveException:
            logger.exception('Rolling back transaction due to an error while saving %s...' % self.__class__.__name__)
            try:
                transaction.rollback()
            except Exception as rollbackException:
                logger.exception('Unable to rollback!')
于 2013-11-13T10:22:40.827 回答
1

您通常希望将其分为两个问题:

  • 内容问题,即你尝试在db中保存同一行两次,触发了数据库约束导致的错误。这将引发一个可捕获的IntegrityError. 请参阅:https : //docs.djangoproject.com/en/dev/ref/exceptions/#database-exceptions(Django 1.6+ 有更多错误)。您可能应该抓住那些并使用类似的东西messages.error来通知用户。
  • 数据库已关闭或出现其他严重问题。您可能应该避免捕获错误,让 django 为您处理它,并显示您自己的 500 页面,直到数据库重新联机。请参阅:https ://docs.djangoproject.com/en/dev/howto/error-reporting/和https://docs.djangoproject.com/en/dev/ref/urls/#handler500
于 2013-11-13T10:10:06.273 回答