Кто генерирует первичный ключ (ID) для новой записи в Django ORM: Django или база данных?

«Кто генерирует первичный ключ (ID) для новой записи в Django ORM: Django или база данных?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Первичный ключ (ID) для новой записи в Django ORM генерирует база данных, а не сам Django.

Django ORM выступает как прослойка, которая отправляет запрос на вставку записи в БД и затем получает сгенерированный ID обратно, присваивая его соответствующему полю модели.

Процесс генерации ID при сохранении:

  1. При вызове метода save() для нового объекта модели Django ORM формирует SQL-запрос INSERT.
  2. Этот запрос отправляется в базу данных.
  3. База данных создает новую запись и автоматически генерирует значение для первичного ключа (обычно это автоинкрементное поле, например, SERIAL в PostgreSQL или AUTO_INCREMENT в MySQL).
  4. После успешной вставки, база данных возвращает сгенерированный 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 создается на стороне БД.