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. Все значения автоматически проходят валидацию на положительность при сохранении объекта в базу данных.
Синтаксис
from django.db import models
class MyModel(models.Model):
field_name = models.PositiveSmallIntegerField(
default=0,
null=False,
blank=False,
verbose_name="Название поля"
)
Пример
Создадим модель Product с полем rating для хранения рейтинга товара:
from 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}"
Создадим несколько товаров с рейтингом:
from 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)
Результат выполнения кода:
{"name": "Laptop", "rating": 5, "stock": 10}
{"name": "Mouse", "rating": 4, "stock": 25}
{"name": "Keyboard", "rating": 5, "stock": 15}
Пример
Попробуем сохранить отрицательное значение в поле PositiveSmallIntegerField:
from 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)
Результат выполнения кода:
{"rating": ["Ensure this value is greater than or equal to 0."]}
Пример
Выполним фильтрацию товаров по рейтингу с использованием PositiveSmallIntegerField:
from 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)
Результат выполнения кода:
{"name": "Laptop", "rating": 5}
{"name": "Mouse", "rating": 4}
{"name": "Keyboard", "rating": 5}
Пример
Обновим значения поля для всех товаров с рейтингом 5, увеличив их на 1:
from 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)
Результат выполнения кода:
2
{"name": "Laptop", "rating": 6}
{"name": "Mouse", "rating": 4}
{"name": "Keyboard", "rating": 6}
Пример
Используем агрегацию для подсчета суммы рейтингов и количества товаров:
from 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)
Результат выполнения кода:
{"total_rating": 16, "product_count": 3, "avg_rating": 5.333333333333333}
Смотрите также
-
поле
SmallIntegerField,
которое хранит целые числа в диапазоне от -32768 до 32767 -
поле
PositiveIntegerField,
которое хранит целые положительные числа в диапазоне от 0 до 2147483647 -
поле
IntegerField,
которое хранит целые числа в диапазоне от -2147483648 до 2147483647 -
поле
PositiveBigIntegerField,
которое хранит целые положительные числа в диапазоне от 0 до 9223372036854775807