Поле BigIntegerField

Поле BigIntegerField предназначено для хранения целых чисел в диапазоне от -9223372036854775808 до 9223372036854775807. В базу данных оно отображается как BIGINT. Это поле подходит для хранения больших числовых значений, таких как идентификаторы в больших системах, временные метки в микросекундах или большие счетчики. Поле является наследником IntegerField и поддерживает все те же параметры, но с расширенным диапазоном значений.

При определении модели поле принимает стандартные аргументы: null, blank, default, db_index, unique и другие. По умолчанию поле не может быть пустым. Для валидации минимального и максимального значения используются параметры min_value и max_value.

Синтаксис

pythonfrom django.db import models

class MyModel(models.Model):
  big_int = models.BigIntegerField()

Пример

Создадим модель для хранения информации о заказах с большим количеством транзакций:

pythonfrom django.db import models

class Order(models.Model):
  order_id = models.BigIntegerField(unique=True, db_index=True)
  amount = models.BigIntegerField(default=0)
  user_id = models.BigIntegerField()
  created_at = models.DateTimeField(auto_now_add=True)

  def __str__(self):
    return f"Order {self.order_id}"

Теперь создадим несколько записей с большими числовыми значениями:

pythonfrom myapp.models import Order

# Создаем заказы с большими ID и суммами
order1 = Order.objects.create(
  order_id=1000000000000,
  amount=999999999999,
  user_id=123456789
)
order2 = Order.objects.create(
  order_id=1000000000001,
  amount=1500000000000,
  user_id=123456789
)
order3 = Order.objects.create(
  order_id=1000000000002,
  amount=750000000000,
  user_id=987654321
)
print(f"Orders created: {Order.objects.count()}")

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

python"Orders created: 3"

Пример

Давайте выполним фильтрацию и агрегацию по полю BigIntegerField:

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

# Находим заказы с суммой больше 1 триллиона
large_orders = Order.objects.filter(amount__gt=1000000000000)
print(f"Large orders: {large_orders.count()}")

# Вычисляем статистику по сумме заказов для пользователя
user_id = 123456789
stats = Order.objects.filter(user_id=user_id).aggregate(
  total=Sum('amount'),
  max_order=Max('amount'),
  min_order=Min('amount'),
  avg_order=Avg('amount')
)
print(stats)

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

python"Large orders: 1"
{'total': 2500000000000, 'max_order': 1500000000000, 'min_order': 1000000000000, 'avg_order': 1250000000000.0}

Пример

Поле BigIntegerField также можно использовать с валидацией минимальных и максимальных значений:

pythonfrom django.db import models

class Product(models.Model):
  name = models.CharField(max_length=100)
  stock = models.BigIntegerField(min_value=0, max_value=1000000000000)

  def __str__(self):
    return self.name

# Пример попытки создания с валидацией
try:
  Product.objects.create(
    name="Test Product",
    stock=1500000000000  # Превышает max_value
  )
except Exception as e:
  print(f"Error: {e}")

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

python"Error: stock value 1500000000000 is greater than max_value 1000000000000"

Пример

Поле BigIntegerField можно использовать для хранения временных меток в миллисекундах или микросекундах:

pythonfrom myapp.models import Event
import time

class Event(models.Model):
  name = models.CharField(max_length=100)
  timestamp = models.BigIntegerField()
  data = models.JSONField()

# Сохраняем событие с текущей временной меткой в микросекундах
current_time = int(time.time() * 1000000)
event = Event.objects.create(
  name="User Login",
  timestamp=current_time,
  data={"user_id": 12345, "ip": "192.168.1.1"}
)
print(f"Event created with timestamp: {event.timestamp}")

# Находим события за последний час
one_hour_ago = (time.time() - 3600) * 1000000
recent_events = Event.objects.filter(timestamp__gte=int(one_hour_ago))
print(f"Recent events: {recent_events.count()}")

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

python"Event created with timestamp: 1735075200000000"
"Recent events: 1"

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

  • поле IntegerField,
    которое хранит 32-битные целые числа
  • поле PositiveBigIntegerField,
    которое хранит только неотрицательные большие целые числа
  • поле SmallIntegerField,
    которое хранит 16-битные целые числа
  • поле PositiveIntegerField,
    которое хранит только неотрицательные 32-битные целые числа