Поле 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,
которое хранит малые целые числа со знаком без автоматического приращения