DecimalField

Поле DecimalField применяется в моделях Django для хранения чисел с фиксированной точностью, таких как финансовые показатели, цены или любые другие значения, где важна точность вычислений. В отличие от FloatField, DecimalField хранит числа в десятичном виде без потери точности. Основные параметры поля: max_digits - общее количество цифр в числе, и decimal_places - количество цифр после десятичной запятой. Также доступны стандартные параметры полей Django, такие как null, blank, default и другие.

Синтаксис

pythonfrom django.db import models

class MyModel(models.Model):
  price = models.DecimalField(
    max_digits=10,
    decimal_places=2,
    default=0.00
  )

Пример

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

pythonfrom django.db import models

class Product(models.Model):
  name = models.CharField(max_length=100)
  price = models.DecimalField(
    max_digits=10,
    decimal_places=2,
    default=0.00
  )
  margin = models.DecimalField(
    max_digits=5,
    decimal_places=2,
    default=0.00
  )

  def __str__(self):
    return self.name

Пример

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

pythonfrom myapp.models import Product

# Creating products
product1 = Product.objects.create(
  name="Laptop",
  price=999.99,
  margin=10.00
)
product2 = Product.objects.create(
  name="Mouse",
  price=25.50,
  margin=5.00
)
product3 = Product.objects.create(
  name="Keyboard",
  price=75.75,
  margin=8.00
)

# Display all products
for product in Product.objects.all():
  print(f"{product.name}: ${product.price}")

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

python"Laptop: $999.99"
"Mouse: $25.50"
"Keyboard: $75.75"

Пример

Выполним арифметические операции с полем DecimalField, используя аннотации:

pythonfrom django.db.models import F, ExpressionWrapper, fields
from myapp.models import Product

# Calculate price with margin using F expressions
products_with_total = Product.objects.annotate(
  total_price=ExpressionWrapper(
    F('price') * (1 + F('margin') / 100),
    output_field=fields.DecimalField(
      max_digits=10,
      decimal_places=2
    )
  )
)

for product in products_with_total:
  print(f"{product.name}: total ${product.total_price}")

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

python"Laptop: total $1099.99"
"Mouse: total $26.78"
"Keyboard: total $81.81"

Пример

Фильтрация записей с использованием DecimalField:

pythonfrom myapp.models import Product

# Find products with price greater than 50
expensive_products = Product.objects.filter(price__gt=50.00)

for product in expensive_products:
  print(product.name)

# Find products with price between 20 and 100
mid_range_products = Product.objects.filter(
  price__gte=20.00,
  price__lte=100.00
)

for product in mid_range_products:
  print(f"{product.name}: ${product.price}")

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

python"Laptop"
"Keyboard"
"Mouse: $25.50"
"Keyboard: $75.75"

Пример

Агрегация данных с использованием DecimalField:

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

# Calculate statistics
stats = Product.objects.aggregate(
  avg_price=Avg('price'),
  sum_margin=Sum('margin'),
  max_price=Max('price'),
  min_price=Min('price')
)

print(f"Average price: {stats['avg_price']}")
print(f"Total margin: {stats['sum_margin']}")
print(f"Max price: {stats['max_price']}")
print(f"Min price: {stats['min_price']}")

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

python"Average price: 367.08"
"Total margin: 23.00"
"Max price: 999.99"
"Min price: 25.50"

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

  • поле IntegerField,
    которое хранит целые числа
  • поле FloatField,
    которое хранит числа с плавающей точкой
  • поле PositiveIntegerField,
    которое хранит только положительные целые числа
  • поле BigIntegerField,
    которое хранит большие целые числа