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

一般に、これを 2 つの問題に分割する必要があります。

  • コンテンツの問題。つまり、同じ行を db に 2 回保存しようとしたため、データベースの制約によってエラーが発生しました。これにより、 catchable が発生し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 に答える