4

データベースに到達した場合は、明らかに IntegrityError です。ただし、これがデータベースに到達する前に発生する場合 (たとえば、Manager クラスの save メソッドで発生する場合)、どのような例外を発生させるのが適切でしょうか?

例:

class MyManager(models.Manager):
    def create_from_user(self, user):
        try:
            existing = self.get(user=user)
            raise Exception("There is already an object for this user.") # more specific exception needed
        except self.DoesNotExist:
            # begin creating the record

レコードの性質上、get_or_create タイプの状況は望ましくありません (レコードが既に存在する場合にこのメソッドを使用すると、例外をスローするハード エラーになります)。

テーブルに一意の制約を設定すると、明らかに最終的に IntegrityError がスローされますが、これに依存するのではなく、コードで明示的にすることをお勧めします。しかし、どの例外が最も正確かはわかりません (または、自分でロールバックする必要があるかどうか)。

4

2 に答える 2

8

これはValidationError. これは、一意のフィールドで重複するエントリに遭遇したときに、Django がフォームとモデルの clean メソッドでスローするものです。

于 2012-06-29T21:31:05.210 に答える
2

自分を投げてみませんIntegrityErrorか?ある意味で、データベース関連のコードは、整合性の問題が発生しようとしていることを検出しました。すでに名前が付けられているものを説明するために、別のエラー/例外を作成する必要はありません。

于 2012-06-29T21:23:02.310 に答える