РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
28 of 818 menu

Поле SmallAutoField

Поле SmallAutoField является разновидностью автоматического поля в Django, которое хранит целые числа в диапазоне от 1 до 32767. Это поле автоматически генерирует следующее целое число при создании новой записи. В отличие от AutoField, которое использует INTEGER, и BigAutoField, использующее BIGINT, SmallAutoField занимает меньше места в базе данных и подходит для проектов с ограниченным количеством записей.

Синтаксис

from django.db import models class MyModel(models.Model): id = models.SmallAutoField(primary_key=True) # другие поля

Поле принимает следующие параметры:

Параметры

Основные параметры поля SmallAutoField:

  • primary_key - если установлено в True, поле становится первичным ключом модели. По умолчанию False.
  • verbose_name - удобочитаемое имя поля для отображения в административном интерфейсе.
  • db_column - имя колонки в базе данных. Если не указано, используется имя поля.
  • db_index - создает ли индекс для поля. По умолчанию False.
  • default - значение по умолчанию для поля. Для SmallAutoField обычно не используется, так как значение генерируется автоматически.

Поле SmallAutoField автоматически создает последовательность в базе данных для генерации уникальных значений.

Пример . Простая модель

Рассмотрим использование SmallAutoField в модели для категорий товаров:

from django.db import models class Category(models.Model): id = models.SmallAutoField(primary_key=True) name = models.CharField(max_length=50) description = models.TextField(blank=True) def __str__(self): return self.name

При создании новой категории значение поля id будет присвоено автоматически:

from myapp.models import Category category = Category.objects.create(name="Electronics") print(category.id)

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

"1"

Пример . С явным указанием первичного ключа

По умолчанию Django автоматически добавляет поле AutoField для первичного ключа. Вы можете заменить его на SmallAutoField, указав параметр primary_key=True:

from django.db import models class Tag(models.Model): id = models.SmallAutoField(primary_key=True) name = models.CharField(max_length=30) created_at = models.DateTimeField(auto_now_add=True)

Теперь при создании тега поле id будет получать автоматически увеличиваемое значение в пределах допустимого диапазона:

from myapp.models import Tag tag1 = Tag.objects.create(name="Python") tag2 = Tag.objects.create(name="Django") print(f"Tag 1 ID: {tag1.id}") print(f"Tag 2 ID: {tag2.id}")

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

"Tag 1 ID: 1" "Tag 2 ID: 2"

Пример . Использование с ForeignKey

Поле SmallAutoField может использоваться как внешний ключ для связи с другой моделью. Рассмотрим пример с товарами и заказами:

from django.db import models class Product(models.Model): id = models.SmallAutoField(primary_key=True) name = models.CharField(max_length=100) price = models.DecimalField(max_digits=10, decimal_places=2) class Order(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) quantity = models.PositiveSmallIntegerField()

Теперь создадим продукт и заказ с ним:

from myapp.models import Product, Order product = Product.objects.create(name="Laptop", price=999.99) order = Order.objects.create(product=product, quantity=2) print(f"Product ID: {product.id}") print(f"Order product ID: {order.product.id}")

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

"Product ID: 1" "Order product ID: 1"

Пример . Проверка автоматической генерации

Создадим несколько записей подряд, чтобы увидеть автоматическое увеличение значения:

from myapp.models import Tag tags = ["Web", "Mobile", "AI", "Data"] for tag_name in tags: tag = Tag.objects.create(name=tag_name) print(f"Created tag '{tag_name}' with ID: {tag.id}")

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

"Created tag 'Web' with ID: 3" "Created tag 'Mobile' with ID: 4" "Created tag 'AI' with ID: 5" "Created tag 'Data' with ID: 6"

Пример . Ограничение диапазона

При достижении максимального значения поля SmallAutoField (32767) возникает ошибка базы данных. Рассмотрим пример, демонстрирующий это ограничение (для учебных целей создадим модель с явным указанием максимального значения, хотя в реальности это определяется на уровне БД):

from django.db import models class NumberSequence(models.Model): id = models.SmallAutoField(primary_key=True) value = models.CharField(max_length=10)

При попытке создания записи после достижения лимита будет выброшено исключение:

from myapp.models import NumberSequence from django.db import IntegrityError try: for i in range(32770): NumberSequence.objects.create(value=f"Item {i}") except IntegrityError as e: print(f"Error: {e}")

Результат выполнения кода (в реальности возникает ошибка переполнения):

"Error: out of range value for column 'id'"

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

  • поле AutoField,
    которое использует целочисленный тип INTEGER для первичного ключа
  • поле BigAutoField,
    которое использует тип BIGINT для больших диапазонов значений
  • поле PositiveSmallIntegerField,
    которое хранит положительные малые целые числа без автоматического приращения
  • поле SmallIntegerField,
    которое хранит малые целые числа со знаком без автоматического приращения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить