Ответ
Первичный ключ (ID) для новой записи в Django ORM генерирует база данных, а не сам Django.
Django ORM выступает как прослойка, которая отправляет запрос на вставку записи в БД и затем получает сгенерированный ID обратно, присваивая его соответствующему полю модели.
Процесс генерации ID при сохранении:
- При вызове метода
save()для нового объекта модели Django ORM формирует SQL-запросINSERT. - Этот запрос отправляется в базу данных.
- База данных создает новую запись и автоматически генерирует значение для первичного ключа (обычно это автоинкрементное поле, например,
SERIALв PostgreSQL илиAUTO_INCREMENTв MySQL). - После успешной вставки, база данных возвращает сгенерированный ID. Django ORM получает его и обновляет атрибут
id(или имя вашего первичного ключа) у объекта модели.
Пример:
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
# Создаем новый объект, ID еще не присвоен
obj = MyModel(name='Тестовая запись')
print(f"ID до сохранения: {obj.id}") # Вывод: ID до сохранения: None
# Сохраняем объект в БД
obj.save()
# После сохранения, ID получен от БД
print(f"ID после сохранения: {obj.id}") # Вывод: ID после сохранения: 1 (или другое сгенерированное значение)
По умолчанию, Django использует AutoField для первичных ключей, который автоматически управляет этим процессом, делегируя генерацию ID базе данных. Механизмы генерации ID могут немного отличаться в разных СУБД, но принцип остается тем же: ID создается на стороне БД.