データベースに到達した場合は、明らかに 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 がスローされますが、これに依存するのではなく、コードで明示的にすることをお勧めします。しかし、どの例外が最も正確かはわかりません (または、自分でロールバックする必要があるかどうか)。