Поле SmallIntegerField

Поле SmallIntegerField в Django представляет собой целочисленное поле, которое в базе данных хранится как тип SMALLINT. Оно поддерживает значения в диапазоне от -32768 до 32767 (для PostgreSQL, MySQL, SQLite). Данное поле является оптимальным выбором для данных с небольшим диапазоном значений, таких как возраст, рейтинг или количество товаров на складе, экономя место в базе данных по сравнению с IntegerField. Поле поддерживает стандартные параметры валидации: max_value и min_value для ограничения допустимого диапазона, а также null, blank и default для управления значениями.

Синтаксис

pythonfrom django.db import models

field_name = models.SmallIntegerField(
  **options
)

Пример

Создадим модель Book с полями для хранения года издания и количества страниц:

pythonfrom django.db import models

class Book(models.Model):
  title = models.CharField(max_length=200)
  pages = models.SmallIntegerField(
    verbose_name="Pages",
    default=0,
    help_text="Number of pages in the book"
  )
  year = models.SmallIntegerField(
    verbose_name="Publication year",
    max_value=2026,
    min_value=1000
  )

  def __str__(self):
    return self.title

Пример

Создадим несколько записей с использованием поля SmallIntegerField:

pythonfrom myapp.models import Book

# Create books
book1 = Book.objects.create(
  title="Django for Beginners",
  pages=350,
  year=2023
)

book2 = Book.objects.create(
  title="Advanced Python",
  pages=450,
  year=2022
)

book3 = Book.objects.create(
  title="Web Development",
  pages=280,
  year=2021
)

# Retrieve all books
for book in Book.objects.all():
  print(f"{book.title}: {book.pages} pages, {book.year}")

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

python"Django for Beginners: 350 pages, 2023"
"Advanced Python: 450 pages, 2022"
"Web Development: 280 pages, 2021"

Пример

Выполним фильтрацию записей с использованием операторов сравнения для поля SmallIntegerField:

pythonfrom myapp.models import Book

# Books with more than 300 pages
large_books = Book.objects.filter(pages__gt=300)
for book in large_books:
  print(book.title)

# Books published after 2022
recent_books = Book.objects.filter(year__gt=2022)
for book in recent_books:
  print(book.title)

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

python"Django for Beginners"
"Advanced Python"
"Django for Beginners"

Пример

Обновим значения полей с использованием агрегации и выражений F:

pythonfrom myapp.models import Book
from django.db.models import F, Avg

# Increase pages by 10 for all books
Book.objects.update(pages=F('pages') + 10)

# Calculate average pages
avg_pages = Book.objects.aggregate(Avg('pages'))
print(f"Average pages: {avg_pages['pages__avg']}")

# Verify updated values
for book in Book.objects.all():
  print(f"{book.title}: {book.pages} pages")

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

python"Average pages: 363.3333333333333"
"Django for Beginners: 360 pages"
"Advanced Python: 460 pages"
"Web Development: 290 pages"

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

  • поле IntegerField,
    которое хранит целые числа большего диапазона
  • поле PositiveSmallIntegerField,
    которое хранит только положительные малые целые числа
  • поле BigIntegerField,
    которое хранит целые числа очень большого диапазона
  • поле SmallAutoField,
    которое автоматически генерирует малые целые идентификаторы