Поле PositiveIntegerField
Поле PositiveIntegerField применяется в моделях Django для хранения целых неотрицательных чисел. Оно наследуется от IntegerField и добавляет валидацию, гарантирующую, что значение всегда будет больше или равно нулю. Это поле идеально подходит для хранения возрастов, количеств, рейтингов, порядковых номеров и других числовых данных, которые не могут быть отрицательными. В базу данных оно преобразуется в целочисленный тип с проверкой на уровне приложения.
Основные параметры поля PositiveIntegerField включают max_length, который не применяется для числовых полей, но передается для совместимости, default для задания значения по умолчанию, null и blank для контроля обязательности, а также validators для добавления пользовательских проверок.
Синтаксис
from django.db import models
class MyModel(models.Model):
positive_num = models.PositiveIntegerField()
Пример
Создадим модель Product с полями для хранения цены в копейках и количества товара на складе:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price_kopecks = models.PositiveIntegerField(default=0)
stock_quantity = models.PositiveIntegerField(default=0)
def __str__(self):
return self.name
Результат создания объекта:
from myapp.models import Product
product = Product.objects.create(
name="Laptop",
price_kopecks=150000,
stock_quantity=25
)
print(f"{product.name}: {product.price_kopecks} kopecks, {product.stock_quantity} items")
Результат выполнения кода:
"Laptop: 150000 kopecks, 25 items"
Пример
Поле PositiveIntegerField автоматически проверяет, что значение неотрицательное. Попытка сохранить отрицательное число вызовет ошибку валидации:
from myapp.models import Product
product = Product(
name="Invalid Product",
price_kopecks=-100,
stock_quantity=10
)
product.full_clean()
Результат выполнения кода:
"django.core.exceptions.ValidationError: {'price_kopecks': ['Value must be a positive integer.']}"
Пример
Рассмотрим использование поля PositiveIntegerField с заданием значения по умолчанию и опциональностью:
from django.db import models
class Review(models.Model):
author = models.CharField(max_length=50)
rating = models.PositiveIntegerField(default=0)
likes = models.PositiveIntegerField(default=0, blank=True)
def __str__(self):
return f"Review by {self.author}"
Создадим несколько отзывов с различными значениями:
from myapp.models import Review
review1 = Review.objects.create(author="Alice", rating=5)
review2 = Review.objects.create(author="Bob", rating=3, likes=10)
review3 = Review.objects.create(author="Charlie")
print(f"{review1.author}: rating={review1.rating}, likes={review1.likes}")
print(f"{review2.author}: rating={review2.rating}, likes={review2.likes}")
print(f"{review3.author}: rating={review3.rating}, likes={review3.likes}")
Результат выполнения кода:
"Alice: rating=5, likes=0"
"Bob: rating=3, likes=10"
"Charlie: rating=0, likes=0"
Пример
Получение и фильтрация записей по полю PositiveIntegerField с использованием различных операторов поиска:
from myapp.models import Product
# Получение товаров с количеством больше 10
high_stock = Product.objects.filter(stock_quantity__gt=10)
for product in high_stock:
print(f"{product.name}: {product.stock_quantity} items")
# Получение товаров с ценой от 1000 до 5000 копеек
mid_price = Product.objects.filter(
price_kopecks__gte=1000,
price_kopecks__lte=5000
)
print(f"Products in range: {mid_price.count()}")
Результат выполнения кода:
"Notebook: 25 items"
"Mouse: 15 items"
"Products in range: 2"
Смотрите также
-
поле
IntegerField,
которое хранит целые числа без ограничения на знак -
поле
PositiveSmallIntegerField,
которое хранит положительные числа в диапазоне 0-32767 -
поле
PositiveBigIntegerField,
которое хранит большие положительные числа до 9223372036854775807 -
поле
FloatField,
которое хранит числа с плавающей точкой