Исключение IntegrityError
Исключение IntegrityError выбрасывается Django,
когда операция с базой данных нарушает ограничения
целостности, установленные на уровне модели или базы
данных. Чаще всего это происходит при попытке сохранить
объект с неуникальным значением для поля, имеющего
атрибут unique=True, или при попытке создать
запись, связанную с несуществующим объектом через
внешний ключ. Исключение является подклассом
DatabaseError и помогает разработчику
обрабатывать ошибки, связанные с нарушением бизнес-логики
на уровне данных.
Синтаксис
from django.db import IntegrityError
try:
# operation that may violate integrity
...
except IntegrityError:
# handle the error
Пример
Рассмотрим модель пользователя с уникальным адресом электронной почты. Попытка создать двух пользователей с одинаковой почтой вызовет исключение:
from django.db import models
from django.db import IntegrityError
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
# First user - saved successfully
user1 = User(name="John Doe", email="john@example.com")
user1.save()
# Second user with the same email - raises IntegrityError
try:
user2 = User(name="Jane Doe", email="john@example.com")
user2.save()
except IntegrityError as e:
print("Error:", e)
Результат выполнения кода:
"Error: UNIQUE constraint failed: app_user.email"
Пример
Обработка ошибки внешнего ключа при попытке создать комментарий к несуществующей статье:
from django.db import models
from django.db import IntegrityError
class Article(models.Model):
title = models.CharField(max_length=200)
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
text = models.TextField()
# Try to create a comment for an article that does not exist
try:
comment = Comment(article_id=999, text="Great article!")
comment.save()
except IntegrityError as e:
print("Error:", e)
Результат выполнения кода:
"Error: FOREIGN KEY constraint failed"
Пример
Использование метода get_or_create для обработки
нарушения уникальности без явного перехвата исключения:
from myapp.models import User
# This method returns a tuple (object, created)
user, created = User.objects.get_or_create(
name="John Doe",
email="john@example.com"
)
if created:
print("User was created")
else:
print("User already exists")
Результат выполнения кода:
"User already exists"
Смотрите также
-
исключение
DatabaseError,
базовое исключение для всех ошибок базы данных -
исключение
ProtectedError,
возникающее при попытке удалить объект с защищенными связями -
исключение
FieldError,
возникающее при ошибках в полях модели -
исключение
ValidationError,
возникающее при ошибках валидации формы