Исключение DataError

Исключение DataError относится к подмодулю django.db и наследуется от DatabaseError. Оно возникает, когда передаваемые в запрос данные не соответствуют ожидаемому типу, формату или ограничениям поля базы данных. Например, попытка вставить слишком длинную строку в поле с ограничением по длине или передача некорректного числового значения в целочисленное поле вызывает данное исключение.

Синтаксис

pythonfrom django.db import DataError
from django.db import models

Пример

Рассмотрим модель Book, в которой поле 'isbn' имеет максимальную длину 13 символов. При попытке сохранить книгу с ISBN длиннее 13 символов будет выброшено исключение DataError:

pythonfrom django.db import models

class Book(models.Model):
  title = models.CharField(max_length=100)
  isbn = models.CharField(max_length=13)
  pages = models.IntegerField()

# Попытка сохранить книгу с длинным ISBN
book = Book(
  title="Django for Beginners",
  isbn="978-1-4493-3410-7-extra",  # Длиннее 13 символов
  pages=350
)
try:
  book.save()
except DataError as e:
  print("DataError caught:", e)

Результат выполнения кода:

python"DataError caught: value too long for type character varying(13)"

Пример

Исключение DataError также возникает при попытке передать некорректное значение для числового поля. Например, при сохранении числа с плавающей точкой в поле IntegerField:

pythonfrom django.db import models

class Product(models.Model):
  name = models.CharField(max_length=50)
  price = models.IntegerField()  # Ожидает целое число

# Попытка сохранить продукт с дробной ценой
product = Product(
  name="Laptop",
  price=1299.99  # Дробное число для IntegerField
)
try:
  product.save()
except DataError as e:
  print("DataError caught:", e)

Результат выполнения кода:

python"DataError caught: invalid input syntax for type integer: '1299.99'"

Пример

Исключение DataError может возникнуть и при выполнении запросов на фильтрацию, если переданное значение не соответствует типу поля. Например, при попытке отфильтровать записи по числовому полю с передачей строкового значения:

pythonfrom django.db import models
from django.db import DataError

class Employee(models.Model):
  name = models.CharField(max_length=100)
  age = models.IntegerField()

# Попытка отфильтровать сотрудников по возрасту строкой
try:
  employees = Employee.objects.filter(age="thirty five")
  print(employees)
except DataError as e:
  print("DataError caught:", e)

Результат выполнения кода:

python"DataError caught: invalid input syntax for type integer: 'thirty five'"

Пример

Исключение DataError также можно перехватывать вместе с более общим исключением DatabaseError для обработки любых ошибок базы данных:

pythonfrom django.db import models
from django.db import DatabaseError, DataError

class Order(models.Model):
  order_id = models.CharField(max_length=20)
  quantity = models.IntegerField()

# Обработка ошибок данных
try:
  order = Order(
    order_id="ORD-12345-VERY-LONG",  # Слишком длинный ID
    quantity="ten"  # Некорректное значение для IntegerField
  )
  order.save()
except DataError as e:
  print("DataError caught:", e)
except DatabaseError as e:
  print("DatabaseError caught:", e)

Результат выполнения кода:

python"DataError caught: value too long for type character varying(20)"

Смотрите также

  • исключение IntegrityError,
    возникающее при нарушении целостности данных
  • исключение DatabaseError,
    базовое исключение для всех ошибок базы данных
  • исключение FieldError,
    возникающее при ошибках в именах полей модели
  • исключение ProgrammingError,
    возникающее при синтаксических ошибках SQL