DecimalField
Поле DecimalField применяется в моделях Django для хранения чисел с фиксированной точностью, таких как финансовые показатели, цены или любые другие значения, где важна точность вычислений. В отличие от FloatField, DecimalField хранит числа в десятичном виде без потери точности. Основные параметры поля: max_digits - общее количество цифр в числе, и decimal_places - количество цифр после десятичной запятой. Также доступны стандартные параметры полей Django, такие как null, blank, default и другие.
Синтаксис
from django.db import models
class MyModel(models.Model):
price = models.DecimalField(
max_digits=10,
decimal_places=2,
default=0.00
)
Пример
Давайте создадим модель Product с полями для цены и наценки:
from 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
Пример
Создадим несколько товаров с различными ценами и наценками:
from 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}")
Результат выполнения кода:
"Laptop: $999.99"
"Mouse: $25.50"
"Keyboard: $75.75"
Пример
Выполним арифметические операции с полем DecimalField, используя аннотации:
from 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}")
Результат выполнения кода:
"Laptop: total $1099.99"
"Mouse: total $26.78"
"Keyboard: total $81.81"
Пример
Фильтрация записей с использованием DecimalField:
from 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}")
Результат выполнения кода:
"Laptop"
"Keyboard"
"Mouse: $25.50"
"Keyboard: $75.75"
Пример
Агрегация данных с использованием DecimalField:
from 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']}")
Результат выполнения кода:
"Average price: 367.08"
"Total margin: 23.00"
"Max price: 999.99"
"Min price: 25.50"
Смотрите также
-
поле
IntegerField,
которое хранит целые числа -
поле
FloatField,
которое хранит числа с плавающей точкой -
поле
PositiveIntegerField,
которое хранит только положительные целые числа -
поле
BigIntegerField,
которое хранит большие целые числа