PositiveSmallIntegerField

Поле PositiveSmallIntegerField предназначено для хранения целых положительных чисел в Django модели. Оно соответствует типу данных smallint в SQL с ограничением UNSIGNED. Данное поле гарантирует, что значение всегда будет неотрицательным. В зависимости от базы данных, диапазон допустимых значений может отличаться: в SQLite это -9223372036854775808 до 9223372036854775807, в PostgreSQL 0 до 32767, в MySQL 0 до 65535, в Oracle 0 до 32767. Это поле идеально подходит для хранения небольших счетчиков, рейтингов, количества товаров или других данных, которые не могут быть отрицательными.

При создании поля можно указать необязательные параметры: default - значение по умолчанию, null - разрешает или запрещает хранение NULL, blank - разрешает пустые значения в формах, validators - список валидаторов, verbose_name - человекочитаемое имя поля. По умолчанию null=False и blank=False. Все значения автоматически проходят валидацию на положительность при сохранении объекта в базу данных.

Синтаксис

pythonfrom django.db import models

class MyModel(models.Model):
  field_name = models.PositiveSmallIntegerField(
    default=0,
    null=False,
    blank=False,
    verbose_name="Название поля"
  )

Пример

Создадим модель Product с полем rating для хранения рейтинга товара:

pythonfrom django.db import models

class Product(models.Model):
  name = models.CharField(max_length=100)
  rating = models.PositiveSmallIntegerField(default=0)
  stock = models.PositiveSmallIntegerField(default=0)

  def __str__(self):
    return f"{self.name} - {self.rating}"

Создадим несколько товаров с рейтингом:

pythonfrom myapp.models import Product

# Create products with ratings
product1 = Product.objects.create(name="Laptop", rating=5, stock=10)
product2 = Product.objects.create(name="Mouse", rating=4, stock=25)
product3 = Product.objects.create(name="Keyboard", rating=5, stock=15)

res = Product.objects.all().values('name', 'rating', 'stock')
for item in res:
  print(item)

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

python{"name": "Laptop", "rating": 5, "stock": 10}
{"name": "Mouse", "rating": 4, "stock": 25}
{"name": "Keyboard", "rating": 5, "stock": 15}

Пример

Попробуем сохранить отрицательное значение в поле PositiveSmallIntegerField:

pythonfrom myapp.models import Product
from django.core.exceptions import ValidationError

try:
  product = Product(name="Monitor", rating=-1, stock=5)
  product.full_clean()
  product.save()
except ValidationError as e:
  print(e.message_dict)

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

python{"rating": ["Ensure this value is greater than or equal to 0."]}

Пример

Выполним фильтрацию товаров по рейтингу с использованием PositiveSmallIntegerField:

pythonfrom myapp.models import Product

# Filter products with rating greater than 3
high_rated = Product.objects.filter(rating__gt=3)
res = high_rated.values('name', 'rating')
for item in res:
  print(item)

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

python{"name": "Laptop", "rating": 5}
{"name": "Mouse", "rating": 4}
{"name": "Keyboard", "rating": 5}

Пример

Обновим значения поля для всех товаров с рейтингом 5, увеличив их на 1:

pythonfrom myapp.models import Product
from django.db.models import F

# Increase rating for all products with rating 5
updated = Product.objects.filter(rating=5).update(rating=F('rating') + 1)
print(updated)

# Check the new ratings
res = Product.objects.all().values('name', 'rating')
for item in res:
  print(item)

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

python2
{"name": "Laptop", "rating": 6}
{"name": "Mouse", "rating": 4}
{"name": "Keyboard", "rating": 6}

Пример

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

pythonfrom myapp.models import Product
from django.db.models import Sum, Count, Avg

# Aggregate statistics
stats = Product.objects.aggregate(
  total_rating=Sum('rating'),
  product_count=Count('id'),
  avg_rating=Avg('rating')
)
print(stats)

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

python{"total_rating": 16, "product_count": 3, "avg_rating": 5.333333333333333}

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

  • поле SmallIntegerField,
    которое хранит целые числа в диапазоне от -32768 до 32767
  • поле PositiveIntegerField,
    которое хранит целые положительные числа в диапазоне от 0 до 2147483647
  • поле IntegerField,
    которое хранит целые числа в диапазоне от -2147483648 до 2147483647
  • поле PositiveBigIntegerField,
    которое хранит целые положительные числа в диапазоне от 0 до 9223372036854775807