CompositePrimaryKey
Поле CompositePrimaryKey предназначено для создания составного первичного ключа, который состоит из нескольких полей модели. Это поле добавляется в атрибут Meta модели и позволяет комбинировать несколько полей для уникальной идентификации каждой записи. В отличие от стандартного поля AutoField, автоматически создающего числовой идентификатор, составной ключ дает возможность использовать естественные бизнес-ключи.
Синтаксис
from 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'.
Мы хотим, чтобы эти два поля вместе образовывали первичный ключ:
from 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'. В базе данных для этих полей будет создан составной первичный ключ.
Пример
При использовании составного первичного ключа доступ к объекту модели осуществляется через кортеж значений:
from 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)
Результат выполнения кода:
"A123"
Пример
Составной первичный ключ также поддерживает связи через внешние ключи. Например, модель 'OrderItem' может ссылаться на 'Order' через его составной ключ:
from 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,
который содержит дополнительные настройки модели