Поле SmallIntegerField
Поле SmallIntegerField в Django представляет собой целочисленное поле,
которое в базе данных хранится как тип SMALLINT. Оно поддерживает
значения в диапазоне от -32768 до 32767 (для PostgreSQL, MySQL, SQLite).
Данное поле является оптимальным выбором для данных с небольшим
диапазоном значений, таких как возраст, рейтинг или количество товаров
на складе, экономя место в базе данных по сравнению с IntegerField.
Поле поддерживает стандартные параметры валидации: max_value и
min_value для ограничения допустимого диапазона, а также
null, blank и default для управления значениями.
Синтаксис
from django.db import models
field_name = models.SmallIntegerField(
**options
)
Пример
Создадим модель Book с полями для хранения года издания и количества страниц:
from 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:
from 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}")
Результат выполнения кода:
"Django for Beginners: 350 pages, 2023"
"Advanced Python: 450 pages, 2022"
"Web Development: 280 pages, 2021"
Пример
Выполним фильтрацию записей с использованием операторов сравнения для поля SmallIntegerField:
from 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)
Результат выполнения кода:
"Django for Beginners"
"Advanced Python"
"Django for Beginners"
Пример
Обновим значения полей с использованием агрегации и выражений F:
from 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")
Результат выполнения кода:
"Average pages: 363.3333333333333"
"Django for Beginners: 360 pages"
"Advanced Python: 460 pages"
"Web Development: 290 pages"
Смотрите также
-
поле
IntegerField,
которое хранит целые числа большего диапазона -
поле
PositiveSmallIntegerField,
которое хранит только положительные малые целые числа -
поле
BigIntegerField,
которое хранит целые числа очень большого диапазона -
поле
SmallAutoField,
которое автоматически генерирует малые целые идентификаторы