Поле PositiveIntegerField

Поле PositiveIntegerField применяется в моделях Django для хранения целых неотрицательных чисел. Оно наследуется от IntegerField и добавляет валидацию, гарантирующую, что значение всегда будет больше или равно нулю. Это поле идеально подходит для хранения возрастов, количеств, рейтингов, порядковых номеров и других числовых данных, которые не могут быть отрицательными. В базу данных оно преобразуется в целочисленный тип с проверкой на уровне приложения.

Основные параметры поля PositiveIntegerField включают max_length, который не применяется для числовых полей, но передается для совместимости, default для задания значения по умолчанию, null и blank для контроля обязательности, а также validators для добавления пользовательских проверок.

Синтаксис

pythonfrom django.db import models

class MyModel(models.Model):
  positive_num = models.PositiveIntegerField()

Пример

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

pythonfrom 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

Результат создания объекта:

pythonfrom 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")

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

python"Laptop: 150000 kopecks, 25 items"

Пример

Поле PositiveIntegerField автоматически проверяет, что значение неотрицательное. Попытка сохранить отрицательное число вызовет ошибку валидации:

pythonfrom myapp.models import Product

product = Product(
  name="Invalid Product",
  price_kopecks=-100,
  stock_quantity=10
)
product.full_clean()

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

python"django.core.exceptions.ValidationError: {'price_kopecks': ['Value must be a positive integer.']}"

Пример

Рассмотрим использование поля PositiveIntegerField с заданием значения по умолчанию и опциональностью:

pythonfrom 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}"

Создадим несколько отзывов с различными значениями:

pythonfrom 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}")

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

python"Alice: rating=5, likes=0"
"Bob: rating=3, likes=10"
"Charlie: rating=0, likes=0"

Пример

Получение и фильтрация записей по полю PositiveIntegerField с использованием различных операторов поиска:

pythonfrom 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()}")

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

python"Notebook: 25 items"
"Mouse: 15 items"
"Products in range: 2"

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

  • поле IntegerField,
    которое хранит целые числа без ограничения на знак
  • поле PositiveSmallIntegerField,
    которое хранит положительные числа в диапазоне 0-32767
  • поле PositiveBigIntegerField,
    которое хранит большие положительные числа до 9223372036854775807
  • поле FloatField,
    которое хранит числа с плавающей точкой