CompositePrimaryKey

Поле CompositePrimaryKey предназначено для создания составного первичного ключа, который состоит из нескольких полей модели. Это поле добавляется в атрибут Meta модели и позволяет комбинировать несколько полей для уникальной идентификации каждой записи. В отличие от стандартного поля AutoField, автоматически создающего числовой идентификатор, составной ключ дает возможность использовать естественные бизнес-ключи.

Синтаксис

pythonfrom django.db import models

class MyModel(models.Model):
  field_one = models.IntegerField()
  field_two = models.CharField(max_length=100)

  class Meta:
    composite_primary_key = [field_one, field_two]

Пример

Допустим, у нас есть модель 'Order' с полями 'order_id' и 'product_code'. Мы хотим, чтобы эти два поля вместе образовывали первичный ключ:

pythonfrom django.db import models

class Order(models.Model):
  order_id = models.IntegerField()
  product_code = models.CharField(max_length=10)

  class Meta:
    composite_primary_key = [order_id, product_code]

Теперь каждая запись в таблице 'Order' будет уникально идентифицироваться комбинацией 'order_id' и 'product_code'. В базе данных для этих полей будет создан составной первичный ключ.

Пример

При использовании составного первичного ключа доступ к объекту модели осуществляется через кортеж значений:

pythonfrom myapp.models import Order

# Создание объекта с составным ключом
order = Order.objects.create(order_id=1001, product_code='A123')

# Получение объекта по составному ключу
res = Order.objects.get(pk=(1001, 'A123'))
print(res.product_code)

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

python"A123"

Пример

Составной первичный ключ также поддерживает связи через внешние ключи. Например, модель 'OrderItem' может ссылаться на 'Order' через его составной ключ:

pythonfrom django.db import models

class OrderItem(models.Model):
  order = models.ForeignKey(
    'Order',
    to_field=('order_id', 'product_code'),
    on_delete=models.CASCADE,
  )
  quantity = models.IntegerField()
  price = models.DecimalField(max_digits=10, decimal_places=2)

  class Meta:
    composite_primary_key = [order, quantity]

В этом примере внешний ключ 'order' ссылается на составной первичный ключ модели 'Order', что позволяет правильно организовать связь между таблицами.

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

  • поле AutoField,
    которое создает автоматически увеличивающийся первичный ключ
  • поле IntegerField,
    которое используется для хранения целочисленных значений
  • поле CharField,
    которое предназначено для хранения строковых значений
  • класс Meta,
    который содержит дополнительные настройки модели